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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Конструктор копирования в потомках QObject.  (Прочитано 6172 раз)
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 - не свойства).
Записан
sociopath
Гость
« Ответ #1 : Июнь 14, 2015, 17:03 »

Первое, что приходит на ум - сделать MyClass наследником QObject и MyClassData. В MyClassData хранить данные (name, x, y и прочее) в секции protected, чтобы были доступны классу MyClass. Тогда конструктору копирования MyClass будет достаточно вызывать конструктор QObject (некопирующий) и конструктор MyClassData (копирующий).
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #2 : Июнь 14, 2015, 17:26 »

Объекты нельзя копировать. Точка.
Записан
GrieVeR-13
Гость
« Ответ #3 : Июнь 14, 2015, 18:19 »

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

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

Может лучше реализовать свой механизм X_PROPERTY...
« Последнее редактирование: Июнь 14, 2015, 18:21 от GrieVeR-13 » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Июнь 15, 2015, 07:07 »

Да, я тоже об этом думал, что есть смысл сделать подобие QSharedData. Но это совсем другой подход, очень много придется переписывать. Надеялся, что существует мифический способ сделать сериализацию менее заметной для сотен уже давно написанных классов.
А нет ли сериализации для этих классов? По смыслу должна быть, тогда ее и использовать
Записан
Hrundel
Гость
« Ответ #5 : Июнь 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;

и всё!
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Июнь 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;

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

А в Вашей системе образования я разочарован. "Всего понемногу", там побегали, сям, а нормально оператор написать не научили.
Записан
Hrundel
Гость
« Ответ #7 : Июнь 17, 2015, 18:43 »

А разве кто-то сказал, что немецкая система образования хорошая? В точных науках российское образование превосходит немецкое в разы.
Проблема России не в образовании.
Записан
Akon
Гость
« Ответ #8 : Июнь 19, 2015, 14:44 »

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

Для объектов-значений конструктор копирования по умолчанию делает всю работу.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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