Russian Qt Forum

Qt => Общие вопросы => Тема начата: GrieVeR-13 от Июнь 14, 2015, 13:46



Название: Конструктор копирования в потомках QObject.
Отправлено: GrieVeR-13 от Июнь 14, 2015, 13:46
Здравствуйте.
Как известно, конструктор копирования QObject находится в приватной секции, возможно ли в наследниках класса QObject определить свой конструктор копирования без зубодробительных построчных присвоений значения каждому полю объекта? Например конструкция вида:
Код:
MyClass(const MyClass &other) { 
    name = other.name;
    x = other.x;
    y = other.y;
}
совсем не впечатляет.
QObject использую для реализации механизма сериализации через Q_PROPERTY (х, y - не свойства).


Название: Re: Конструктор копирования в потомках QObject.
Отправлено: sociopath от Июнь 14, 2015, 17:03
Первое, что приходит на ум - сделать MyClass наследником QObject и MyClassData. В MyClassData хранить данные (name, x, y и прочее) в секции protected, чтобы были доступны классу MyClass. Тогда конструктору копирования MyClass будет достаточно вызывать конструктор QObject (некопирующий) и конструктор MyClassData (копирующий).


Название: Re: Конструктор копирования в потомках QObject.
Отправлено: Авварон от Июнь 14, 2015, 17:26
Объекты нельзя копировать. Точка.


Название: Re: Конструктор копирования в потомках QObject.
Отправлено: GrieVeR-13 от Июнь 14, 2015, 18:19
Первое, что приходит на ум - сделать MyClass наследником QObject и MyClassData. В MyClassData хранить данные (name, x, y и прочее) в секции protected, чтобы были доступны классу MyClass. Тогда конструктору копирования MyClass будет достаточно вызывать конструктор QObject (некопирующий) и конструктор MyClassData (копирующий).
Да, я тоже об этом думал, что есть смысл сделать подобие QSharedData. Но это совсем другой подход, очень много придется переписывать. Надеялся, что существует мифический способ сделать сериализацию менее заметной для сотен уже давно написанных классов.

Авварон: а я и не хочу копировать данные QObject, меня интересует только мои данные.

Может лучше реализовать свой механизм X_PROPERTY...


Название: Re: Конструктор копирования в потомках QObject.
Отправлено: Igors от Июнь 15, 2015, 07:07
Да, я тоже об этом думал, что есть смысл сделать подобие QSharedData. Но это совсем другой подход, очень много придется переписывать. Надеялся, что существует мифический способ сделать сериализацию менее заметной для сотен уже давно написанных классов.
А нет ли сериализации для этих классов? По смыслу должна быть, тогда ее и использовать


Название: Re: Конструктор копирования в потомках QObject.
Отправлено: Hrundel от Июнь 16, 2015, 22:14
А почему оператор то не написать ко всем своим классам?

Код
C++ (Qt)
MyClass MyClass::operator=(const MyClass& right)
{
   MyClass result;
   result.set_x(right.x());
   result.set_y(right.y());
   return result;
}

А потом так - опа:

Код
C++ (Qt)
obj1 = obj2;

и всё!


Название: Re: Конструктор копирования в потомках QObject.
Отправлено: Igors от Июнь 17, 2015, 06:36
А почему оператор то не написать ко всем своим классам?

Код
C++ (Qt)
MyClass MyClass::operator=(const MyClass& right)
{
   MyClass result;
   result.set_x(right.x());
   result.set_y(right.y());
   return result;
}

А потом так - опа:

Код
C++ (Qt)
obj1 = obj2;

и всё!
Потому что при наличии многих десятков членов это трудоемкая/унылая операция, о чем ТС и писал в первом посте.

А в Вашей системе образования я разочарован. "Всего понемногу", там побегали, сям, а нормально оператор написать не научили.


Название: Re: Конструктор копирования в потомках QObject.
Отправлено: Hrundel от Июнь 17, 2015, 18:43
А разве кто-то сказал, что немецкая система образования хорошая? В точных науках российское образование превосходит немецкое в разы.
Проблема России не в образовании.


Название: Re: Конструктор копирования в потомках QObject.
Отправлено: Akon от Июнь 19, 2015, 14:44
Цитировать
Объекты нельзя копировать. Точка.
Правильно. QObject'ы - это т.н. объекты-сущности (считай животные или люди  :)). Копируйте только объекты-значения. Не нужно смешивать посредством открытого наследования объекты-сущности и объекты-значения, последние нужно делать членами сущностей. Например, QWidget::font().

Для объектов-значений конструктор копирования по умолчанию делает всю работу.