Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Knjagskij
-4 / 6 / 2
Регистрация: 10.11.2008
Сообщений: 776
Завершенные тесты: 1
1

Конструктор копирования у QObject

31.05.2016, 11:44. Просмотров 774. Ответов 10
Метки нет (Все метки)

Как копировать объекты наследники QObject (как свои, так и qt-шные)?
При переопределении конструктора копирования мы же все-равно сталкиваемся с копированием QObject-ов, или нам нужно все копировать через memcopy, что не очень хорошо... да еще переопределять оператор для стороннего класса, что вроде как тоже плохо. А как быть в такой ситуации? И может ли она вообще возникнуть?
Кстати, почему плохо переопределять операторы для объектов из библиотек, вроде бы может нарушится переносимость кода, но я забыл за счет чего
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.05.2016, 11:44
Ответы с готовыми решениями:

Как написать конструктор от двух классов QObject и QAbstractNativeEventFilter
Всем привет! Новичок:) Пытаюсь написать прогу для определения подключившегося...

QObject connect
Возможно повторяюсь, но не могу найти поиском своей ошибки #ifndef...

QObject::connect
#include <QtWidgets> class Counter: public QObject { Q_OBJECT private:...

Наследование QObject
Здравствуйте. Столкнулся с такой проблемой: Сейчас учу слоты и сигналы и вот...

QObject::fintChild
У меня есть ряд динамически создающихся объектов, в частности QLineEdit...

10
Wyn
1056 / 638 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
31.05.2016, 12:45 2
Никак. Если вам надо копировать QObject, то значит у вас что-то пошло не так в архитектуре вашего приложения.
0
sashatref
75 / 75 / 29
Регистрация: 21.05.2015
Сообщений: 257
Завершенные тесты: 1
31.05.2016, 15:01 3
Knjagskij, для этого лучше использовать QVariant. Пихаете свой тип в QVariant, а его можно копировать куда угодно и как угодно.
0
Wyn
1056 / 638 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
31.05.2016, 16:30 4
Цитата Сообщение от sashatref Посмотреть сообщение
Knjagskij, для этого лучше использовать QVariant. Пихаете свой тип в QVariant, а его можно копировать куда угодно и как угодно.
Что за бред вы человеку советуете?
0
sashatref
75 / 75 / 29
Регистрация: 21.05.2015
Сообщений: 257
Завершенные тесты: 1
31.05.2016, 16:33 5
Wyn, аргументируйте, почему бред?
0
Wyn
1056 / 638 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
31.05.2016, 18:38 6
Цитата Сообщение от sashatref Посмотреть сообщение
Wyn, аргументируйте, почему бред?
Потому что QObject и его производные копировать не стоит от слова совсем. Он не для того.
Да и к тому же вы где-нибудь у QVariant конструктор с QObject видите?
0
sashatref
75 / 75 / 29
Регистрация: 21.05.2015
Сообщений: 257
Завершенные тесты: 1
31.05.2016, 19:01 7
Wyn
Потому что QObject и его производные копировать не стоит от слова совсем. Он не для того.
что-то слабый аргумент, после утверждений что это бред.
Да и к тому же вы где-нибудь у QVariant конструктор с QObject видите?
Зато есть метод fromValue, не так ли?
0
Wyn
1056 / 638 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
31.05.2016, 19:22 8
Цитата Сообщение от sashatref Посмотреть сообщение
что-то слабый аргумент, после утверждений что это бред.
http://doc.qt.io/qt-5/object.html#identity-vs-value
Цитата Сообщение от sashatref Посмотреть сообщение
Зато есть метод fromValue, не так ли?
Ничего, что этот метод - шаблонный и при компиляции копирования QObject даст сбой?
0
sashatref
75 / 75 / 29
Регистрация: 21.05.2015
Сообщений: 257
Завершенные тесты: 1
31.05.2016, 19:31 9
Wyn, вот сразу бы и давали ссылки, а не "потому что".
Вопрос был про классы-наследники, для них определяй конструктор копирования, оператор присваивания, Q_DECLARE_METATYPE и можно использовать fromValue. С qt-ными такое не прокатит.
0
Pancir
57 / 44 / 11
Регистрация: 16.09.2014
Сообщений: 124
31.05.2016, 20:48 10
Цитата Сообщение от Knjagskij Посмотреть сообщение
или нам нужно все копировать через memcopy, что не очень хорошо
Не очень хорошо? это абсолютный undefined behavior для не pod типов.

Если дизайн класса сделан как non copyable то не нужно этому противостоять, значит есть причины почему должно быть так, а не иначе.

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

Wyn уже написал, что если вам надо копировать QObject то у вас, что то не так с дизайном приложения. Ну или реализуйте clone семантику сами.

Цитата Сообщение от sashatref Посмотреть сообщение
Вопрос был про классы-наследники, для них определяй конструктор копирования, оператор присваивания, Q_DECLARE_METATYPE и можно использовать fromValue. С qt-ными такое не прокатит.
Ну и нафига тут QVariant? конструктор есть? оператор есть? почему не делать копирование на прямую a=b или a(b), а делать его через QVariant ? чтобы скучно не было?

Если вы в наследнике определите конструктор копирования и оператор, то что вы будете делать с non copyable QObject от которого вы наследуетесь? Можно его тупо игнорировать, но нужно понимать, что в итоге получаем ну или писать самому, что и как должно переноситься с одного QObject в другой, там по ссылке выше написано на, что стоит обращать внимание.

Свой наследник от QObject по факту вы можете сделать копируемый, на практике если такая потребность есть, то стоит пристально присмотреться к дизайну приложения.

С кутишными объектами та же история, берем кутишный объект наследуемся и все копирование пишем сами на публичных и протектид методах базовых классов.
0
Wyn
1056 / 638 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
31.05.2016, 21:11 11
Цитата Сообщение от sashatref Посмотреть сообщение
Вопрос был про классы-наследники, для них определяй конструктор копирования, оператор присваивания, Q_DECLARE_METATYPE и можно использовать fromValue. С qt-ными такое не прокатит.
Вопрос был про классы-наследники QObject. И переопределять конструктор копирования и оператор присваивания для них - это дичайший быдлокод, при котором существует большая вероятность получить undefined behaviour. Их можно клонировать, это так, но смысла в подобном не много. Как и в применении QVariant. На этом обсуждение предлагаю завершить.
0
31.05.2016, 21:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2016, 21:11

QObject::connect
main.cpp clude <QApplication> #include <QtGui> #include <C.h> #include...

Обнулить укзатель на QObject
Я соединил сигнал объекта с deleteLater() и обнулил после этого указатель на...

Ошибка наследования QObject
Добрый день! Возникла следующая проблема: требуется использование сигналов и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru