Russian Qt Forum

Qt => Общие вопросы => Тема начата: Shilo от Август 26, 2009, 10:52



Название: Как правильно создать наследника QObject?
Отправлено: Shilo от Август 26, 2009, 10:52
Добрый день!
Есть два класса - CoordinateSystem и ProjectProperties. Оба унаследованы от QObject.

projectproperties.h
Код
C++ (Qt)
#include <QObject>
 
class CoordinateSystem;
 
class ProjectProperties: public QObject{
   Q_OBJECT
public:
   ProjectProperties(QObject *parent = 0);
   ~ProjectProperties();
 
public slots:
   CoordinateSystem* coordinateSystem()const {return curCoordinateSystem;}
   void setCoordinateSystem(const CoordinateSystem &newCoordinateSystem);
 
private:
   CoordinateSystem* curCoordinateSystem;
};
 

projectproperties.cpp
Код
C++ (Qt)
#include "coordinatesystem.h"
#include "projectproperties.h"
 
ProjectProperties::ProjectProperties(QObject *parent): QObject(parent)
{
   curCoordinateSystem = new CoordinateSystem(this);
}
 
 
void ProjectProperties::setCoordinateSystem(const CoordinateSystem &newCoordinateSystem)
{
   *curCoordinateSystem = newCoordinateSystem; //TRUBLE
}
 

coordinatesystem.h
Код
C++ (Qt)
#include <QObject>
 
class CoordinateSystem : public QObject{
   Q_OBJECT
public:
   CoordinateSystem(QObject *parent = 0);
   ~CoordinateSystem();
 
   QString name() const {return curName;}
   void setName(const QString &newName);
 
signals:
   void nameChanged();
 
private:
   QString curName;
};
 

coordinatesystem.cpp
Код
C++ (Qt)
#include "coordinatesystem.h"
 
CoordinateSystem::CoordinateSystem(QObject *parent): QObject(parent)
{
 
}
 
CoordinateSystem::~CoordinateSystem()
{
 
}
 
void CoordinateSystem::setName(const QString &newName)
{
   curName = newName;
   emit nameChanged();
}
 

main.cpp
Код
C++ (Qt)
#include <QtCore>
#include <QCoreApplication>
#include "coordinatesystem.h"
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
   ProjectProperties properties = new ProjectProperties();
   return a.exec();
}
 

При компиляции выдается сообщение об ошибке
projectproperties.cpp: In member function `CoordinateSystem& CoordinateSystem::operator=(const CoordinateSystem&)':
c:/Qt/4.5.0/include/QtCore/../../src/corelib/kernel/qobject.h:302: error: `QObject& QObject::operator=(const QObject&)' is private
projectproperties.cpp:44: error: within this context

Знаю, что у QObject оператор = и конструктор копирования объявлены в private секции.
Так вот собственно вопрос. Как правильно создать наследника QObject, чтобы подобный код заработал?


Название: Re: Как правильно создать наследника QObject?
Отправлено: spirit от Август 26, 2009, 11:12
так
Код
C++ (Qt)
ProjectProperties *properties = new ProjectProperties();
 
а еще лучше в стеке (ибо я не вижу где удаляется объект).


Название: Re: Как правильно создать наследника QObject?
Отправлено: Shilo от Август 26, 2009, 11:23
так
Код
C++ (Qt)
ProjectProperties *properties = new ProjectProperties();
 
а еще лучше в стеке (ибо я не вижу где удаляется объект).
Ладно, пусть так. Но Проблемы это ни как не решает. Компилятор ругается на функцию
Код
C++ (Qt)
void ProjectProperties::setCoordinateSystem(const CoordinateSystem &newCoordinateSystem)
{
   *curCoordinateSystem = newCoordinateSystem;
}
 
в файле projectproperties.cpp


Название: Re: Как правильно создать наследника QObject?
Отправлено: spirit от Август 26, 2009, 11:30
оператор присваивания запривачен в QObject.
передавай указатель, а не ссылку.


Название: Re: Как правильно создать наследника QObject?
Отправлено: Shilo от Август 26, 2009, 11:41
Изменил на
Код
C++ (Qt)
void ProjectProperties::setCoordinateSystem(const CoordinateSystem *newCoordinateSystem)
{
   curCoordinateSystem = newCoordinateSystem;
}
 
Теперь компилятор выдает следующее:
projectproperties.cpp: In member function `void ProjectProperties::setCoordinateSystem(const CoordinateSystem*)':
projectproperties.cpp:44: error: invalid conversion from `const CoordinateSystem*' to `CoordinateSystem*'


Название: Re: Как правильно создать наследника QObject?
Отправлено: SASA от Август 26, 2009, 11:42
Напиши свой (для класса CoordinateSystem) конструктор копирования и оператор присваивания. И будет тебе счастья ;)


Название: Re: Как правильно создать наследника QObject?
Отправлено: developer от Август 26, 2009, 11:44
Цитировать
оператор присваивания запривачен в QObject.
передавай указатель, а не ссылку.

Думаю что не поможет. Ты можеш переопределить свой оператор =. А можеш просто сделать новый объект в функции
Код:
void ProjectProperties::setCoordinateSystem()
{
    *curCoordinateSystem = new newCoordinateSystem();
}


Название: Re: Как правильно создать наследника QObject?
Отправлено: spirit от Август 26, 2009, 11:45
ну конечно будет выдавать, т.к. у тебя указатель в класе не константый, есть два варианта
первый -- убрать const в сигнатуре метода ProjectProperties::setCoordinateSystem,
второй -- приведение по const_cast.


Название: Re: Как правильно создать наследника QObject?
Отправлено: spirit от Август 26, 2009, 11:46
тролли не просто так заприватили оператор присваивания для QObject.


Название: Re: Как правильно создать наследника QObject?
Отправлено: developer от Август 26, 2009, 11:53
Лучше убрать const в сигнатуре, потому что некоторые авторы по с++ не рекомендуют использовать const_cast для "обезвреживания" const (почему не знаю, если кто-то отпишет буду признателен).

Кстати в книжке выцарапал правильное переопределение оператора =(ето если нужно)
Код:
String& String::operator=(const String& s1)
{
if (this == &s1) return *this;
delete s;
// Уничтожить предыдущее значение
s = new char[strlen(s1.s) + 1];
strcpy(s, s1.s);
return *this;
}


Название: Re: Как правильно создать наследника QObject?
Отправлено: spirit от Август 26, 2009, 11:55
Лучше убрать const в сигнатуре, потому что некоторые авторы по с++ не рекомендуют использовать const_cast для "обезвреживания" const (почему не знаю, если кто-то отпишет буду признателен).
потому как сигнатура подразумевает, что объект не будет меняться, а ты внутри функции берешь и снимаешь это ограничение.
Кстати в книжке выцарапал правильное переопределение оператора =(ето если нужно)
Код:
String& String::operator=(const String& s1)
{
if (this == &s1) return *this;
delete s;
// Уничтожить предыдущее значение
s = new char[strlen(s1.s) + 1];
strcpy(s, s1.s);
return *this;
}
еще раз повторю -- тролли не просто так заприватили оператор присваивания.


Название: Re: Как правильно создать наследника QObject?
Отправлено: Shilo от Август 26, 2009, 12:00
тролли не просто так заприватили оператор присваивания для QObject.
Вот и я тоже думаю, что не зря.
ну конечно будет выдавать, т.к. у тебя указатель в класе не константый, есть два варианта
первый -- убрать const в сигнатуре метода ProjectProperties::setCoordinateSystem,
второй -- приведение по const_cast.
Первый вариант: Дык мне надо, чтоб передаваемый в функцтю объект точно не изменялся.
Второй вариант: А я вот не знаю как это делается. Можно пример привести?


Название: Re: Как правильно создать наследника QObject?
Отправлено: developer от Август 26, 2009, 12:04
to Spirit

спасибо  ;)


Название: Re: Как правильно создать наследника QObject?
Отправлено: developer от Август 26, 2009, 12:06
const int* b = &a;
int* c = const_cast<int*>(b);


Название: Re: Как правильно создать наследника QObject?
Отправлено: developer от Август 26, 2009, 12:07
После етого "b"  "теряет" свою константность


Название: Re: Как правильно создать наследника QObject?
Отправлено: Shilo от Август 26, 2009, 12:17
Лучше убрать const в сигнатуре, потому что некоторые авторы по с++ не рекомендуют использовать const_cast для "обезвреживания" const (почему не знаю, если кто-то отпишет буду признателен).
потому как сигнатура подразумевает, что объект не будет меняться, а ты внутри функции берешь и снимаешь это ограничение.
А чем это может быть чревато? Если я сделаю вот так
Код
C++ (Qt)
void ProjectProperties::setCoordinateSystem(const CoordinateSystem *newCoordinateSystem)
{
   curCoordinateSystem = const_cast<CoordinateSystem*>(newCoordinateSystem);
}
 
это ведь не будет означать, что *newCoordinateSystem в дальнейшем можно изменить внутри этой функции. Или я ошибаюсь?


Название: Re: Как правильно создать наследника QObject?
Отправлено: spirit от Август 26, 2009, 12:31
для наглядности
Код
C++ (Qt)
...
void ProjectProperties::setCoordinateSystem(const CoordinateSystem *newCoordinateSystem)
{
curCoordinateSystem = const_cast<CoordinateSystem*>(newCoordinateSystem);
curCoordinateSystem->setName("newName");
}
...
CoordinateSystem cs;
cs.setName("oldName");
qDebug() << cs.name();//oldName
ProjectProperties pp;
pp.setCoordinateSystem(&cs);
qDebug() << cs.name();//newName
...
 


Название: Re: Как правильно создать наследника QObject?
Отправлено: spirit от Август 26, 2009, 12:35
вот так сделай
Код
C++ (Qt)
...
public slots:
   const CoordinateSystem* coordinateSystem() const {return curCoordinateSystem;}
   void setCoordinateSystem(const CoordinateSystem *newCoordinateSystem)
{
curCoordinateSystem = newCoordinateSystem;
}
 
private:
   const CoordinateSystem* curCoordinateSystem;
...
 


Название: Re: Как правильно создать наследника QObject?
Отправлено: Shilo от Август 26, 2009, 14:59
Вариант с const_cast работает, хотя выглядит несколько грубовато...

А вот это
вот так сделай
Код
C++ (Qt)
...
public slots:
   const CoordinateSystem* coordinateSystem() const {return curCoordinateSystem;}
   void setCoordinateSystem(const CoordinateSystem *newCoordinateSystem)
{
curCoordinateSystem = newCoordinateSystem;
}
 
private:
   const CoordinateSystem* curCoordinateSystem;
...
 
не годится. Ведь в таком случае  curCoordinateSystem становится константой. И как же я ему буду присваивать новое значение? Поправте меня, если я не прав.


Название: Re: Как правильно создать наследника QObject?
Отправлено: spirit от Август 26, 2009, 15:04
дык, ты определись, нужно ли тебе менять значение объета или нет.
если нет, то используй такую сигнатуру:setCoordinateSystem(CoordinateSystem *newCoordinateSystem)
это и будет правильным подходом, нежели чем использовать приведение типов.


Название: Re: Как правильно создать наследника QObject?
Отправлено: Shilo от Август 26, 2009, 15:26
Я давно определился. Мне нужно менять значение CoordinateSystem *curCoordinateSystem - приватного члена класса ProjectProperties. Если этот член объявить const CoordinateSystem *curCoordinateSystem , то как же я его буду менять?
С другой стороны, этот член меняется спомощью public слота void setCoordinateSystem(const CoordinateSystem *newCoordinateSystem). В качестве параметра этой функции выступает CoordinateSystem *newCoordinateSystem. Сам этот параметр изменяться не должен. Поэтому используется модификатор const.
Вроде все гладко, но при этом необходимо применять const_cast.
Код
C++ (Qt)
void ProjectProperties::setCoordinateSystem(const CoordinateSystem *newCoordinateSystem)
{
   curCoordinateSystem = const_cast<CoordinateSystem*>(newCoordinateSystem);
}
 
Вот вроде и все. Если другого решения нет, то вопрс закрыт.


Название: Re: Как правильно создать наследника QObject?
Отправлено: spirit от Август 26, 2009, 15:27
Первый вариант: Дык мне надо, чтоб передаваемый в функцтю объект точно не изменялся.
тогда к чему вот это?


Название: Re: Как правильно создать наследника QObject?
Отправлено: spirit от Август 26, 2009, 15:29
убери const из ProjectProperties::setCoordinateSystem и тогда будет понятно,
что объект будет меняться, но не обязательно именно в этом методе.
если же оставлять const, то будет сбивать с толку изменение объекта (пример (http://www.prog.org.ru/index.php?topic=10418.msg62209#msg62209) я уже приводил с переустановкой имени объекта).


Название: Re: Как правильно создать наследника QObject?
Отправлено: Shilo от Август 26, 2009, 15:31
Первый вариант: Дык мне надо, чтоб передаваемый в функцтю объект точно не изменялся.
тогда к чему вот это?
Видимо я не очень точно выразился. Вместо "передаваемый в функцтю объект" нужно было сказать "параметр функции"... Сори :-\


Название: Re: Как правильно создать наследника QObject?
Отправлено: spirit от Август 26, 2009, 15:32
Первый вариант: Дык мне надо, чтоб передаваемый в функцтю объект точно не изменялся.
тогда к чему вот это?
Видимо я не очень точно выразился. Вместо "передаваемый в функцтю объект" нужно было сказать "параметр функции"... Сори :-\
бывает :). ну в общем я бы не юзал приведение, а убрал бы const из сигнатуры.


Название: Re: Как правильно создать наследника QObject?
Отправлено: Shilo от Август 26, 2009, 15:39
IMHO const в сигнатуре функции не только предотвращает изменение параметра функции в процессе ее выполнения на этапе компилирования (тут все идет прахом из-за применения const_cast), но и информирует об этом программиста, читающего листинг.


Название: Re: Как правильно создать наследника QObject?
Отправлено: spirit от Август 26, 2009, 15:42
мне бы не было понятным, почему после передачи объекта как константый указатель в метод, он затем поменял состояние...


Название: Re: Как правильно создать наследника QObject?
Отправлено: Shilo от Август 26, 2009, 15:57
spirit, очевидно вы не совсем вникли. Метод должен менять private член объекта, для которого этот метод вызван. Но он не должен менять объек, который передается в качестве параметра этого метода. Оба они (и private член и параметр метода) являются объектами одного класса. В данном случае класса CoordinateSystem. Сам метод описан в классе ProjectProperties.
Я бы не поднимал эту тему, если бы не одно НО. Класс CoordinateSystem является потомком QObject. В QObject конструктор копирования и оператор = объявлены private. Если бы не это обстоятельство, то можно было бы в качестве аргумента метода вместо указателя использовать ссылку.

Короче всм СПАСИБО, я разобрался.


Название: Re: Как правильно создать наследника QObject?
Отправлено: Shilo от Август 27, 2009, 10:22
Нет не разобрался. Тут может возникнуть проблема при передаче параметра как указателя.
Допустим где-то в программе я создал временную переменную cs класса CoordinateSystem как указатель. Далее я передаю эту переменную в метод ProjectProperties::setCoordinateSystem. А затем удаляю переменную cs и освобождаю память. Если в методе ProjectProperties::setCoordinateSystem использовать код
Код
C++ (Qt)
void ProjectProperties::setCoordinateSystem(const CoordinateSystem *newCoordinateSystem)
{
   if (newCoordinateSystem){
     curCoordinateSystem = const_cast<CoordinateSystem*>(newCoordinateSystem); //так нельзя!
   };
}
 
то в curCoordinateSystem будет содержаться адрес по которому память уже освобождена. Последствия всем понятны.
И еще ньюанс. Если не удалять временную переменную, то мы получаем доступ к закрытому члену curCoordinateSystem что не есть правильно.
Значит выше приведенный код неприемлим. Вместо него надо скопировать ЗНАЧЕНИЯ каждого поля из параметра функции в наш закрытый член класса. По сути это альтернатива оператоа =. Какого ляда тролли объявили его закрытым в QObject я не знаю. Но думаю у них есть на это причины.
Прилагаю тестовый проектик с наследованием от QObject. Просмотрите, может я чего не так наваял. А может есть вообще радикально другой способ.


Название: Re: Как правильно создать наследника QObject?
Отправлено: spirit от Август 27, 2009, 10:32
для этого есть QPointer.
Код
C++ (Qt)
...
QPointer<CoordinateSystem> curCoordinateSystem;
...
 
и потом проверяй указатель
Код
C++ (Qt)
...
if (!curCoordinateSystem)
  return;
...
 


Название: Re: Как правильно создать наследника QObject?
Отправлено: Shilo от Август 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.
Копируется адрес а не данные. Опять же не решается проблем с доступом к закрытому члену класса через временную переменную.


Название: Re: Как правильно создать наследника QObject?
Отправлено: spirit от Август 27, 2009, 11:15
в таких случаях клонируют объект. сделай метод clone в CoordinateSystem,
который будет конструировать новый объект, но с такими же параметрами как и исходный и тогда в методе ProjectProperties::setCoordinateSystem клонируй его.


Название: Re: Как правильно создать наследника QObject?
Отправлено: Shilo от Август 27, 2009, 11:25
в таких случаях клонируют объект. сделай метод clone в CoordinateSystem,
который будет конструировать новый объект, но с такими же параметрами как и исходный и тогда в методе ProjectProperties::setCoordinateSystem клонируй его.
Вот эта идея мне нравится. То есть в методе ProjectProperties::setCoordinateSystem я сначала присваиваю члену curCoordinateSystem адрес параметра newCoordinateSystem затем клонирую curCoordinateSystem. Таким образом в нем уже содержится другой адре. Далее удаляю временную переменную и освобождаю занятую ею память, а мне не страшно ;D. Ведь эта переменная и curCoordinateSystem уже указывают на разные адреса!!!
Если я не прав, поправте меня.


Название: Re: Как правильно создать наследника QObject?
Отправлено: spirit от Август 27, 2009, 11:28
все верно, только при клонировании нужно не ошибиться с парентом,
если в качестве парента указать целевой объект,
то клонированный объект разрушится при разрушении целевого объекта.


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


Название: Re: Как правильно создать наследника QObject?
Отправлено: spirit от Август 27, 2009, 11:45
да можно и так, только сигнатура чуть другая будет
Код
C++ (Qt)
CoordinateSystem* CoordinateSystem::clone(QObject *parent, CoordinateSystem* oldCS);
 
;)


Название: Re: Как правильно создать наследника QObject?
Отправлено: SASA от Август 27, 2009, 11:50
еще раз повторю -- тролли не просто так заприватили оператор присваивания.

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

Я копирую объекты, присваиваю, храню их в списках, запихиваю QVarint. Негативных последствий я не наблюдал. Не видел я и указаний то, что наследников QObject нельзя копировать. Может я чё упустил?


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


Название: Re: Как правильно создать наследника QObject?
Отправлено: spirit от Август 27, 2009, 11:53
Я копирую объекты, присваиваю, храню их в списках, запихиваю QVarint. Негативных последствий я не наблюдал.
это справедливо для объектов, которые не являются потомками QObject.

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

из сырцов
Код
C++ (Qt)
...
private:
   Q_DISABLE_COPY(QObject)
...
 
а вот теперь подумай, что будет, если присвоить одному виджету другой, если бы операции копирования и присваивания были открыты.  ;)


Название: Re: Как правильно создать наследника QObject?
Отправлено: Shilo от Август 27, 2009, 11:57
Я копирую объекты, присваиваю, храню их в списках, запихиваю QVarint. Негативных последствий я не наблюдал. Не видел я и указаний то, что наследников QObject нельзя копировать. Может я чё упустил?
Полагаю, что в случае с QObject (и его потомками тоже) вы копируете не объекты, а адреса объектов. Ибо в противном случае такой код просто не скомпилируется. Нельзя использовать закрытые члены классов. А конструктор копирования и оператор = в QObject объявлены private.


Название: Re: Как правильно создать наследника QObject?
Отправлено: spirit от Август 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.


Название: Re: Как правильно создать наследника QObject?
Отправлено: ритт от Август 27, 2009, 12:27
а мне вообще вся эта ветка видится притянутой за уши. нельзя копировать объект? - ну и х?? с ним. тебе ведь всё-равно не нужно копировать нутря объекта - а только твои кастомные данные, подцепленные к этому объекту...
QSharedData не спасёт отца русской демократии?


Название: Re: Как правильно создать наследника QObject?
Отправлено: SASA от Август 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?

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

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

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



Название: Re: Как правильно создать наследника QObject?
Отправлено: SASA от Август 27, 2009, 12:35
нельзя копировать объект? - ну и х?? с ним.

Для меня это вопрос принципиальный. Может мне придётся переписывать 10 метров исходников :o


Название: Re: Как правильно создать наследника QObject?
Отправлено: spirit от Август 27, 2009, 12:37
да копируй на здоровье, я только говорю почему тролли от этого отказались и их код можно считать эталонным.


Название: Re: Как правильно создать наследника QObject?
Отправлено: SASA от Август 27, 2009, 14:03
я только говорю почему тролли от этого отказались
В этом и вопрос - почему?


Название: Re: Как правильно создать наследника QObject?
Отправлено: spirit от Август 27, 2009, 14:05
Цитировать
Qt Objects: Identity vs Value
Some of the added features listed above for the Qt Object Model, require that we think of Qt Objects as identities, not values. Values are copied or assigned; identities are cloned. Cloning means to create a new identity, not an exact copy of the old one. For example, twins have different identities. They may look identical, but they have different names, different locations, and may have completely different social networks.
Then cloning an identity is a more complex operation than copying or assigning a value. We can see what this means in the Qt Object Model.
A Qt Object...
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?
For these reasons, Qt Objects should be treated as identities, not as values. Identities are cloned, not copied or assigned, and cloning an identity is a more complex operation than copying or assigning a value. Therefore, QObject and all subclasses of QObject (direct or indirect) have their copy constructor and assignment operator disabled.


Название: Re: Как правильно создать наследника QObject?
Отправлено: SASA от Август 27, 2009, 14:15
Особенно хороший довод про близнецов ;D


Название: Re: Как правильно создать наследника QObject?
Отправлено: spirit от Август 27, 2009, 14:17
 ;D