Клонирование QObject

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

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

или

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

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

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

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

5
задан Daniel Vérité 12 August 2014 в 18:42
поделиться

2 ответа

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

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

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

7
ответ дан 13 December 2019 в 05:31
поделиться

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

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

5
ответ дан 13 December 2019 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: