Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QMap и QSharedPointer 
:(
    Опции темы
gpepsi
Дата 3.11.2011, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



Наследника QObject нужно было положить в QMap
Код

#include <QMap>
#include <QObject>
#include <QDebug>

class Some : public QObject {
    Q_OBJECT

private:
    int m_value;

public :
    explicit Some(QObject* parent = 0) : QObject(parent), m_value(0) {}
    virtual ~Some()
    {
        qDebug() << "~Some";
    }

    void set_value(int v) { m_value = v; }

signals:
    void compute(void);
};

typedef QMap<int, Some> TContainer;

int main(int argc, char *argv[])
{

    TContainer container;
    container[0];

}


Этого не удалось сделать, т.к. у QObject закрыт оператор присваивания.
Первое что пришло в голову - положить QSharedPointer
Код

typedef QSharedPointer<Some> TPointer;
typedef QMap<int, TPointer> TContainer;

int main(int argc, char *argv[])
{

    TContainer container;
    container[0];
}


у QSharedPointer есть конструктор по умолчанию, что привело в
Код

container[0];


создание пустого указателя. Это недопустимо, т.к. логикой у меня является создание Some* при первом обращении, а не пустого указателя.
Можно ли запретить создания пустого указателя ?

З.Ы. А может для этого есть типа QSharedMap (ну как boost::ptr_map) ?
P.P.S А для чего нужен QSharedData ? Типа Shared Memory ?
PM MAIL   Вверх
math64
Дата 3.11.2011, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



А не проще ли использовать
Код

class TContainer : public QMap<int, Some*> {
public:
  ~TContainer() { foreach(Some* some, values()) delete some; }
};


Добавлено через 8 минут и 23 секунды
или
Код

class TContainer {
public:
  ~TContainer() { foreach(Some* some, map.values()) delete some; }
  Some& operator[] (int index) {
    Some* some = map[index];
    if (some == NULL) { some = new Some(); map[index] = some; }
    return *some;
  }
  // другие методы доступа к map
private:
QMap<int, Some*> map;
};



Это сообщение отредактировал(а) math64 - 3.11.2011, 21:38
PM   Вверх
gpepsi
Дата 3.11.2011, 21:49 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



math64, я просто считаю, что для smart_pointer конструктор по-умолчанию бессмысленна вещь smile
PM MAIL   Вверх
math64
Дата 3.11.2011, 22:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Для хранения объектов, производных от QObject,  есть QPointer - но у него тоже есть конструктор по умолчанию, и у него другое назначение - при удалении объекта он будет ссылаться на NULL. и не будет удалять объект в своём деструкторе.
QSharedPointer тоже имеет конструктор по умолчанию, но имеет также счётчик использования, и в своём деструкторе будет удалять объект при обнулении счётчика.
QWeakPointer хранит слабую ссылки на QSharedPointer, которая обнуляется, когда удаляется QSharedPointer.
QSharedDataPointer хранит объекты, производные от QSharedData.
QSharedMap в Qt4.5, которая у меня стоит на компьютере, нет.
Так что ничего, имеющегося в Qt, напрямую тебе не подходит.
Можешь использовть контейнеры из stl или boost - но я думаю, там всё аналогично.
Самое простое - сделать свою обёртку вокруг QMap<int,Some*> или map<int,Some*>
PM   Вверх
spyswamp
Дата 4.11.2011, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 18.8.2006

Репутация: 1
Всего: 7



Кстати, из всех смарт поинтеров в Qt только QScopedPointer не делает disconnect() или остальные тоже?


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
gpepsi
Дата 4.11.2011, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



Цитата(spyswamp @  4.11.2011,  13:03 Найти цитируемый пост)
Кстати, из всех смарт поинтеров в Qt только QScopedPointer не делает disconnect() или остальные тоже? 

хороший вопрос


Цитата(math64 @  3.11.2011,  22:14 Найти цитируемый пост)
Для хранения объектов, производных от QObject,  есть QPointer 

а зачем он ? Лишь для копирования ?


Цитата(math64 @  3.11.2011,  22:14 Найти цитируемый пост)
QSharedPointer тоже имеет конструктор по умолчанию, но имеет также счётчик использования, и в своём деструкторе будет удалять объект при обнулении счётчика.

c подсчетом ссылок понятно - boost::shared_ptr


Цитата(math64 @  3.11.2011,  22:14 Найти цитируемый пост)
QWeakPointer

понятно - boost::weak_ptr


Цитата(math64 @  3.11.2011,  22:14 Найти цитируемый пост)
QSharedDataPointer хранит объекты, производные от QSharedData.

не понятно для чего QSharedData. смотрел исходники - он тоже имеет подсчет ссылок

То есть не понятно для чего QSharedData и QPointer



Цитата(math64 @  3.11.2011,  22:14 Найти цитируемый пост)
QSharedMap в Qt4.5, которая у меня стоит на компьютере, нет.


жаль


Это сообщение отредактировал(а) gpepsi - 4.11.2011, 16:01
PM MAIL   Вверх
_GRIN_
Дата 9.11.2011, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



Основная задача:
Цитата(gpepsi @  3.11.2011,  19:05 Найти цитируемый пост)
Наследника QObject нужно было положить в QMap


Минимальное решение:
Код

QMap<int,Some*>map;
int key=rand();
Some*obj = new Some;
map.insert(key,obj);


Использование Q<x>Pointer - по мере необходимости в зависимости от задачи.

P.S. "... не ссы, Димон, я так сто раз делал." =)



--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0736 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.