Russian Qt Forum
Ноябрь 26, 2024, 02:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4   Вниз
  Печать  
Автор Тема: Как правильно создать наследника QObject?  (Прочитано 25921 раз)
Shilo
Гость
« Ответ #30 : Август 27, 2009, 11:07 »

Почитал про QPointer. Безопасность его применения заключается в том, что при удалении временной переменной cs закрытй член curCoordinateSystem не будет показывть "пальцем в небо" а обнулится. А мне надо, чтобы после удаления cs в curCoordinateSystem данные сохранились. Ну то есть эти данные надо скопировать. Применять оператор = класса QPointer тоже нельзя.
Цитировать
QPointer<T> & QPointer::operator= ( const QPointer<T> & p )

Assignment operator. This guarded pointer will now point to the same object that p points to.
Копируется адрес а не данные. Опять же не решается проблем с доступом к закрытому члену класса через временную переменную.
Записан
spirit
Гость
« Ответ #31 : Август 27, 2009, 11:15 »

в таких случаях клонируют объект. сделай метод clone в CoordinateSystem,
который будет конструировать новый объект, но с такими же параметрами как и исходный и тогда в методе ProjectProperties::setCoordinateSystem клонируй его.
Записан
Shilo
Гость
« Ответ #32 : Август 27, 2009, 11:25 »

в таких случаях клонируют объект. сделай метод clone в CoordinateSystem,
который будет конструировать новый объект, но с такими же параметрами как и исходный и тогда в методе ProjectProperties::setCoordinateSystem клонируй его.
Вот эта идея мне нравится. То есть в методе ProjectProperties::setCoordinateSystem я сначала присваиваю члену curCoordinateSystem адрес параметра newCoordinateSystem затем клонирую curCoordinateSystem. Таким образом в нем уже содержится другой адре. Далее удаляю временную переменную и освобождаю занятую ею память, а мне не страшно Смеющийся. Ведь эта переменная и curCoordinateSystem уже указывают на разные адреса!!!
Если я не прав, поправте меня.
Записан
spirit
Гость
« Ответ #33 : Август 27, 2009, 11:28 »

все верно, только при клонировании нужно не ошибиться с парентом,
если в качестве парента указать целевой объект,
то клонированный объект разрушится при разрушении целевого объекта.
Записан
Shilo
Гость
« Ответ #34 : Август 27, 2009, 11:42 »

все верно, только при клонировании нужно не ошибиться с парентом,
если в качестве парента указать целевой объект,
то клонированный объект разрушится при разрушении целевого объекта.
Предпологается, что метод CoordinateSyste::clone(parent* QObject) будет вызываться в методе ProjectProperties::setCoordinateSystem. Тогда если в качестве парента указать this, то парентом клонированного объекта будет объект класса ProjectProperties. Кажись так...
А вообще, не могли бы вы написать прототип метода clone(). Я его себе представляю так
Код
C++ (Qt)
CoordinateSystem* CoordinateSystem::clone(parent* QObject, CoordinateSystem* oldCS);
 
Это правильно?
Записан
spirit
Гость
« Ответ #35 : Август 27, 2009, 11:45 »

да можно и так, только сигнатура чуть другая будет
Код
C++ (Qt)
CoordinateSystem* CoordinateSystem::clone(QObject *parent, CoordinateSystem* oldCS);
 
Подмигивающий
Записан
SASA
Гость
« Ответ #36 : Август 27, 2009, 11:50 »

еще раз повторю -- тролли не просто так заприватили оператор присваивания.

Прошу пояснить подробнее.

Я копирую объекты, присваиваю, храню их в списках, запихиваю QVarint. Негативных последствий я не наблюдал. Не видел я и указаний то, что наследников QObject нельзя копировать. Может я чё упустил?
Записан
Shilo
Гость
« Ответ #37 : Август 27, 2009, 11:52 »

да можно и так, только сигнатура чуть другая будет
Код
C++ (Qt)
CoordinateSystem* CoordinateSystem::clone(QObject *parent, CoordinateSystem* oldCS);
 
Подмигивающий
Ну конечно! Это просто я запарился малость.
Чтож, полагаю найдено элегантное и безопасное решение наследования от QObject. По сути метод clone() будет заменой скрытому оператору = и конструктору копирования. Огромное спасибо за помощь.
Записан
spirit
Гость
« Ответ #38 : Август 27, 2009, 11:53 »

Я копирую объекты, присваиваю, храню их в списках, запихиваю QVarint. Негативных последствий я не наблюдал.
это справедливо для объектов, которые не являются потомками QObject.

Не видел я и указаний то, что наследников QObject нельзя копировать. Может я чё упустил?

из сырцов
Код
C++ (Qt)
...
private:
   Q_DISABLE_COPY(QObject)
...
 
а вот теперь подумай, что будет, если присвоить одному виджету другой, если бы операции копирования и присваивания были открыты.  Подмигивающий
« Последнее редактирование: Август 27, 2009, 11:56 от spirit » Записан
Shilo
Гость
« Ответ #39 : Август 27, 2009, 11:57 »

Я копирую объекты, присваиваю, храню их в списках, запихиваю QVarint. Негативных последствий я не наблюдал. Не видел я и указаний то, что наследников QObject нельзя копировать. Может я чё упустил?
Полагаю, что в случае с QObject (и его потомками тоже) вы копируете не объекты, а адреса объектов. Ибо в противном случае такой код просто не скомпилируется. Нельзя использовать закрытые члены классов. А конструктор копирования и оператор = в QObject объявлены private.
« Последнее редактирование: Август 27, 2009, 12:07 от Shilo » Записан
spirit
Гость
« Ответ #40 : Август 27, 2009, 11:59 »

вот, кстати, и вытяжка из ассистанта
Цитировать
No copy constructor or assignment operator
QObject has neither a copy constructor nor an assignment operator. This is by design. Actually, they are declared, but in a private section with the macro Q_DISABLE_COPY(). In fact, all Qt classes derived from QObject (direct or indirect) use this macro to declare their copy constructor and assignment operator to be private. The reasoning is found in the discussion on Identity vs Value on the Qt Object Model page.
The main consequence is that you should use pointers to QObject (or to your QObject subclass) where you might otherwise be tempted to use your QObject subclass as a value. For example, without a copy constructor, you can't use a subclass of QObject as the value to be stored in one of the container classes. You must store pointers.
Записан
ритт
Гость
« Ответ #41 : Август 27, 2009, 12:27 »

а мне вообще вся эта ветка видится притянутой за уши. нельзя копировать объект? - ну и х?? с ним. тебе ведь всё-равно не нужно копировать нутря объекта - а только твои кастомные данные, подцепленные к этому объекту...
QSharedData не спасёт отца русской демократии?
Записан
SASA
Гость
« Ответ #42 : Август 27, 2009, 12:32 »

Полагаю, что в случае с QObject (и его потомками тоже) вы копируете не объекты, а адреса объектов.
Я прекрасно понимаю отличия объекта от адреса объекта.
Цитировать
это справедливо для объектов, которые не являются потомками QObject.
Объекты являются потомкаим QObject, с переопределёнными конструкторами копирвания и присваивания.
Причины запрещения копирования у QObject из того же ассистанта.

Цитировать
might have a unique QObject::objectName(). If we copy a Qt Object, what name should we give the copy?

has a location in an object hierarchy. If we copy a Qt Object, where should the copy be located?

can be connected to other Qt Objects to emit signals to them or to receive signals emitted by them. If we copy a Qt Object, how should we transfer these connections to the copy?

can have new properties added to it at runtime that are not declared in the C++ class. If we copy a Qt Object, should the copy include the properties that were added to the original?

У меня объекты - хранилища неких данных. И берут/кладут эти данные через кутешные проперти. Иногда вызывают у этих объектов слоты.

- Мне пофиг на имена объектов.
- Они не законктены ни с кем.
- В конструторе копирования я чётко указываю парента.
- Динамические проперти не использую.

Почему мне нельзя копировать объекты?

« Последнее редактирование: Август 27, 2009, 14:02 от SASA » Записан
SASA
Гость
« Ответ #43 : Август 27, 2009, 12:35 »

нельзя копировать объект? - ну и х?? с ним.

Для меня это вопрос принципиальный. Может мне придётся переписывать 10 метров исходников Шокированный
Записан
spirit
Гость
« Ответ #44 : Август 27, 2009, 12:37 »

да копируй на здоровье, я только говорю почему тролли от этого отказались и их код можно считать эталонным.
Записан
Страниц: 1 2 [3] 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.234 секунд. Запросов: 21.