Ответ 1
Это по дизайну. Обычный способ его решения - реализовать метод (обычно называемый clone()
), который позволяет указать точную семантику, которая должна применяться при копировании экземпляров вашего класса. Этот подход также препятствует непреднамеренным копиям делать неявно, например, с помощью классов контейнеров.
Из Qt docs:
Нет конструктора или оператора присваивания
QObject не имеет ни конструктора копирования, ни оператора присваивания. Это по дизайну. Фактически, они объявляются, но в частном раздел с макросом Q_DISABLE_COPY(). Действительно, все классы Qt полученный из QObject (прямой или косвенный), использует этот макрос для объявления их конструктор копирования и оператор присваивания являются частными. рассуждения можно найти в обсуждении Identity vs Value на Qt Страница объектной модели.
Главное, что вы должны использовать указатели для QObject (или ваш подкласс QObject), где вы, возможно, захотите использовать ваш подкласс QObject в качестве значения. Например, без копии конструктор, вы не можете использовать подкласс QObject в качестве значения, которое должно быть хранится в одном из классов контейнера. Вы должны хранить указатели.