QObject клонирование - PullRequest
       9

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

5 голосов
/ 18 мая 2010

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

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

или

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

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

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

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

Ответы [ 2 ]

7 голосов
/ 18 мая 2010

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

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

5 голосов
/ 18 мая 2010

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

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

...