2010-05-18 2 views
5

Я знаю, что объекты Qobjects должны быть тождественными значениям, например, вы не можете их копировать, и по умолчанию конструктор и назначение копии отключены, как описано в документации qt. Но возможно ли создать новый QObject из существующего с помощью метода clone? Это будет логическая ошибка? Если я говорюКлонирование QObject

QObject b; 
QObject a; 
b.cloneFrom(a); 

или

QObject a = new QOBject(); 
QObject b = new QOBject(); 
b->cloneFrom(a); 

и метод клонирования копирует такие вещи, как члены и т.д. это было бы неправильно?

И если это нормально, я могу написать собственный экземпляр-конструктор и оператор присваивания, который делает именно это?

Примечание: Я действительно хочу попробовать это с классами, наследующими qobject.

+0

Это также клонирует соединения нет? ИМХО, что-то не так в вашем коде ... можете ли вы повторить это с помощью структур POD? – elcuco

+0

Нет коннектов не нужно клонировать только элементы данных, которые заданы в объекте (в основном те, которые добавлены уровнем наследования). – Olorin

ответ

7

на мой взгляд клонирования объектов QObject почти всегда семантически разбитой и приводит к нежелательным побочным эффектам , из-за того, что они имеют «идентичность», как вы уже сказали. Таким образом, клонирование нарушает все предположения, которые имеют о QObjects, например, их соединения с сигналом/слотом и динамические свойства. Вы должны подумать, действительно ли объекты для клонирования должны быть QObjects, или если «ценность-часть», которую вы хотите клонировать, может быть учтена.

И если вообще, клонирование имеет смысл только для ваших конкретных подклассов QObjects, а не для самих QObject (которые не имеют реальных «значений»).

также, A; B; A.cloneFrom (B) выглядит сломанным, поскольку он не работает, если B является экземпляром подкласса B вместо самого B. Клон должен быть выполнен через виртуальный B * B :: clone() const, я бы сказал.

+3

Я должен добавить, что общая ошибка дизайна заключается в том, чтобы сделать все QObject, а не думать дважды, прежде чем делать это. Я только делаю QObjects там, где это необходимо, т. Е. Где применяется шаблон «identity», и мне нужны сигналы/слоты и т. Д. –

+0

Полностью согласен с Фрэнком. Даже сам Qt содержит много классов, которые не являются производными от QObject. Все контейнеры со значениями, такие как QString, QList, QDomNode ... они не получены из QObject. – VestniK

+0

Мой плохой, когда я написал код, который я дал QObject, в качестве примера, вары не имеют тип qobject, а производного типа должен быть MyClass a, b; b.cloneFrom (a); но я думаю, Я рассмотрю использование класса, не полученного из qobject – Olorin

4

Я думаю, что в этом случае лучше всего создать класс с данными, которые вы хотите скопировать между QObjects. Этот класс не должен быть получен из QObject или любого класса, полученного из QObject. И этот класс будет «контейнером значений». В этом случае вы должны быть в состоянии решить свою проблему действительно хорошим способом. более

Один совет: для этого класса вы можете использовать совместное использование неявных данных с копией на записи, чтобы уменьшить нагрузку ненужного копирования: http://doc.qt.io/qt-5/implicit-sharing.html

Смежные вопросы