Я знаю, что Qobjects, как предполагается, являются идентификационными данными не значения, например, Вы не можете скопировать их, и по умолчанию конструктор копии и присвоение отключены, как объяснено в спокойной документации. Но действительно ли возможно создать новый QObject из существующего с помощью метода клона? Это было бы логической ошибкой? Если я говорю
QObject b;
QObject a;
b.cloneFrom(a);
или
QObject a = new QOBject();
QObject b = new QOBject();
b->cloneFrom(a);
и материал копий метода клона как участники и т.д. это было бы неправильно?
И если это в порядке, я могу записать моему собственному конструктору копии и оператору присваивания, который делает просто это?
Примечание: Я на самом деле хочу попробовать это классами, которые наследовали qobject.
на мой взгляд, клонирование объектов QObject почти всегда семантически нарушено и приводит к нежелательным побочным эффектам из-за того, что они имеют «идентичность», как вы уже сказали. Следовательно, клонирование нарушает все предположения о QObject, такие как их соединения сигнал / слот и динамические свойства. Вам следует подумать, действительно ли объекты для клонирования должны быть объектами QObject, или же "часть значения", которую вы хотите клонировать, можно исключить.
И если это вообще возможно, клонирование имеет смысл только для ваших конкретных подклассов QObjects, но не для самих QObjects (которые не имеют реальных свойств, подобных значению).
также, A; B; A.cloneFrom (B) выглядит сломанным, поскольку он не работает, если B является экземпляром подкласса B вместо самого B. Я бы сказал, что клонирование должно выполняться через виртуальную константу B * B :: clone ().
Я думаю, что в этом случае лучше всего создать класс с данными, которые вы хотите копировать между QObject. Этот класс не должен быть производным от QObject или любого класса, производного от QObject. И этот класс будет «контейнером значений». В этом случае у вас должно получиться действительно хорошее решение вашей проблемы.
Еще один совет: для этого класса вы можете использовать неявное совместное использование данных с копированием при записи, чтобы уменьшить накладные расходы на ненужное копирование: http://doc.qt.io/qt-5/implicit-sharing.html