Форум программистов, компьютерный форум, киберфорум
Наши страницы

Qt

Войти
Регистрация
Восстановить пароль
 
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 775
Завершенные тесты: 1
#1

Конструктор копирования у QObject - C++ Qt

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

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

QObject::connect - C++ Qt
#include <QtWidgets> class Counter: public QObject { Q_OBJECT private: int count; public: Counter(); public...

QObject::connect - C++ Qt
main.cpp clude <QApplication> #include <QtGui> #include <C.h> #include <QVBoxLayout> #include <QPushButton> #include <QLabel> ...

QObject connect - C++ Qt
Возможно повторяюсь, но не могу найти поиском своей ошибки #ifndef OGCOMMANDER_H #define OGCOMMANDER_H #include <QString> ...

Наследование QObject - C++ Qt
Здравствуйте. Столкнулся с такой проблемой: Сейчас учу слоты и сигналы и вот хочу создать класс наследуемый от QObject, но компилятор...

QObject::fintChild - C++ Qt
У меня есть ряд динамически создающихся объектов, в частности QLineEdit *field = new QLineEdit; field->setObjectName("leAge"); ...

QObject::connect - ошибка - C++ Qt
int main(int argc, char *argv) { QApplication a(argc, argv); QWidget wgt; QHBoxLayout *lay = new QHBoxLayout; ...

10
Wyn
Модератор
1052 / 634 / 231
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
31.05.2016, 12:45 #2
Никак. Если вам надо копировать QObject, то значит у вас что-то пошло не так в архитектуре вашего приложения.
0
sashatref
75 / 75 / 27
Регистрация: 21.05.2015
Сообщений: 257
Завершенные тесты: 1
31.05.2016, 15:01 #3
Knjagskij, для этого лучше использовать QVariant. Пихаете свой тип в QVariant, а его можно копировать куда угодно и как угодно.
0
Wyn
Модератор
1052 / 634 / 231
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
31.05.2016, 16:30 #4
Цитата Сообщение от sashatref Посмотреть сообщение
Knjagskij, для этого лучше использовать QVariant. Пихаете свой тип в QVariant, а его можно копировать куда угодно и как угодно.
Что за бред вы человеку советуете?
0
sashatref
75 / 75 / 27
Регистрация: 21.05.2015
Сообщений: 257
Завершенные тесты: 1
31.05.2016, 16:33 #5
Wyn, аргументируйте, почему бред?
0
Wyn
Модератор
1052 / 634 / 231
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
31.05.2016, 18:38 #6
Цитата Сообщение от sashatref Посмотреть сообщение
Wyn, аргументируйте, почему бред?
Потому что QObject и его производные копировать не стоит от слова совсем. Он не для того.
Да и к тому же вы где-нибудь у QVariant конструктор с QObject видите?
0
sashatref
75 / 75 / 27
Регистрация: 21.05.2015
Сообщений: 257
Завершенные тесты: 1
31.05.2016, 19:01 #7
Wyn
Потому что QObject и его производные копировать не стоит от слова совсем. Он не для того.
что-то слабый аргумент, после утверждений что это бред.
Да и к тому же вы где-нибудь у QVariant конструктор с QObject видите?
Зато есть метод fromValue, не так ли?
0
Wyn
Модератор
1052 / 634 / 231
Регистрация: 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 / 27
Регистрация: 21.05.2015
Сообщений: 257
Завершенные тесты: 1
31.05.2016, 19:31 #9
Wyn, вот сразу бы и давали ссылки, а не "потому что".
Вопрос был про классы-наследники, для них определяй конструктор копирования, оператор присваивания, Q_DECLARE_METATYPE и можно использовать fromValue. С qt-ными такое не прокатит.
0
Pancir
57 / 44 / 10
Регистрация: 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
Модератор
1052 / 634 / 231
Регистрация: 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
Привет! Вот еще темы с ответами:

sender into QObject::connect() - C++ Qt
Имеется следующее описаниеQObject::connect(date, SIGNAL(dateChanged(QDate)), this, SLOT(BirthDateChanged(QDate)));Можно ли изнутри...

Обнулить укзатель на QObject - C++ Qt
Я соединил сигнал объекта с deleteLater() и обнулил после этого указатель на этот объект. Удалится ли объект при достижении цикла событий?

Умные указатели на QObject - C++ Qt
Бывают ли случаи, когда имеет смысл использовать умные указатели на объекты-наследники QObject?

Наследование классов и QObject - C++ Qt
У меня есть три класс и вот такое наследование WindowTemplate: public QObject MainWindow: public WindowTemplate, public...


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

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

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