|
|
|
aspirin2003 |
|
||||||
Шустрый Профиль Группа: Участник Сообщений: 111 Регистрация: 18.3.2007 Где: Саратов Репутация: нет Всего: нет |
Извиняюсь что не совсем в тему, но все же...
В общем создаю класс, наследуя его от QObject, например:
и пытаюсь перегрузить в нем оператор '+' Проверяю так:
Но выскакивает ошибка: error C2248: 'QObject::QObject' : cannot access private member declared in class 'QObject' Если же не наследоваться от QObject, то все ok. |
||||||
|
|||||||
anatox91 |
|
|||
программист-самоучка Профиль Группа: Участник Сообщений: 699 Регистрация: 12.1.2008 Где: ++Украина.Крым++ Репутация: нет Всего: 13 |
-------------------- The code is the design © Sony VAIO VGN-FW480J |
|||
|
||||
aspirin2003 |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 111 Регистрация: 18.3.2007 Где: Саратов Репутация: нет Всего: нет |
||||
|
||||
anatox91 |
|
|||
программист-самоучка Профиль Группа: Участник Сообщений: 699 Регистрация: 12.1.2008 Где: ++Украина.Крым++ Репутация: нет Всего: 13 |
aspirin2003, тю блин, сорри, забыл что это мембер
-------------------- The code is the design © Sony VAIO VGN-FW480J |
|||
|
||||
SABROG |
|
|||
Hacker Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Попробуй использовать вместо dd другое имя, обычно имена d и dd используются в приватных классах Qt. Попробуй так изменить:
|
|||
|
||||
anatox91 |
|
|||
программист-самоучка Профиль Группа: Участник Сообщений: 699 Регистрация: 12.1.2008 Где: ++Украина.Крым++ Репутация: нет Всего: 13 |
*deleted*
Это сообщение отредактировал(а) anatox91 - 21.7.2008, 11:21 -------------------- The code is the design © Sony VAIO VGN-FW480J |
|||
|
||||
SABROG |
|
|||
Hacker Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Да нет, только [] и то где-то в QObjectPrivate. |
|||
|
||||
aspirin2003 |
|
||||||
Шустрый Профиль Группа: Участник Сообщений: 111 Регистрация: 18.3.2007 Где: Саратов Репутация: нет Всего: нет |
Нет, эта строка вообще не влияет на ошибку. Даже если ее закомментировать и возвращать NULL, то ничего не меняется. Насколько я понял, ошибка возникает здесь:
P.S. На всякий случай изменять имя на другое пробовал, не помогает Это сообщение отредактировал(а) aspirin2003 - 21.7.2008, 11:42 |
||||||
|
|||||||
SABROG |
|
||||
Hacker Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
В общем дело обстоит так. Конструктор копирования у классов на базе QObject переопределен таким образом, чтобы запретить эту операцию. Существует макрос Q_DISABLE_COPY:
Который прописан в секции private QObject'a:
Может быть возможно переопределить конструктор копирования в своем классе и оператор =, но не известно к чему это может привести. Это сообщение отредактировал(а) SABROG - 21.7.2008, 12:12 |
||||
|
|||||
aspirin2003 |
|
||||
Шустрый Профиль Группа: Участник Сообщений: 111 Регистрация: 18.3.2007 Где: Саратов Репутация: нет Всего: нет |
Моих знаний по C++ врядли хватит чтобы самому с этим разобраться :( Возможно ли решить проблему другим способом? Ведь перегрузка операторов в классе - достаточно распространенное явление P.S. Сделал так:
Теперь вроде работает, но прочитал в одной статейке, что "...Переопределение конструктора копирования является чрезвычайно ответственным поступком. Явное определение конструктора копирования вызывает изменения в работе программы..." Теперь еще вопрос - надо ли в конструкторе копирования что-либо делать с методами класса, или делать только копирование его полей? Это сообщение отредактировал(а) aspirin2003 - 21.7.2008, 13:27 |
||||
|
|||||
SABROG |
|
|||
Hacker Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Конструктор копирования, что идет по-умолчанию сам копирует поля с данными. К методам это никак не относится, код методов один для всех экземпляров класса один, если только это не шаблон класса, где под каждый тип генерятся методы.
Кстати интересно возможно ли вызвать дефолтный конструктор копирования ?:
Или возникнет рекурсия ? А вообще конструкторов 2: CalcElement::CalcElement(const CalcElement& c_el) CalcElement::CalcElement(CalcElement& c_el) |
|||
|
||||
aspirin2003 |
|
||||
Шустрый Профиль Группа: Участник Сообщений: 111 Регистрация: 18.3.2007 Где: Саратов Репутация: нет Всего: нет |
Не знаю насчет рекурсии, но Access violation точно возникает |
||||
|
|||||
SABROG |
|
|||
Hacker Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Потому что стек заканчивается на возврат. Т.е. рекурсия идет.
|
|||
|
||||
aspirin2003 |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 111 Регистрация: 18.3.2007 Где: Саратов Репутация: нет Всего: нет |
Всем спасибо за ответы, особенно SABROG
|
|||
|
||||
aspirin2003 |
|
||||
Шустрый Профиль Группа: Участник Сообщений: 111 Регистрация: 18.3.2007 Где: Саратов Репутация: нет Всего: нет |
Теперь в коде:
вылазит ошибка error C2248: 'QObject::operator =' : cannot access private member declared in class 'QObject' Насколько я понял теперь еще нужно переопределить оператор '='. Как это лучше сделать - копированием полей как в конструкторе копирования, или есть какой-то более оптимальный способ, чтобы не тратить время на перемещение данных в памяти? P.S. Тем более как выяснилось, простое копирование полей не прокатывает :( Делаю:
В res вроде все как надо, а возвращаемый на самом деле объект в полях содержит какую-то чушь. Скорее всего надо как-то по-другому делать, а как именно я не знаю. Помогите пожалуйста! Это сообщение отредактировал(а) aspirin2003 - 24.7.2008, 09:59 |
||||
|
|||||
aspirin2003 |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 111 Регистрация: 18.3.2007 Где: Саратов Репутация: нет Всего: нет |
В общем заработало когда переопределил так:
Однако мне кажется что это не лучший способ (данные перемещаются из одной области памяти в другую). Может есть какой-нибудь способ передачи по указателю/ссылке? |
|||
|
||||
SABROG |
|
|||
Hacker Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Т.е. если позволить компилятору присваивать данные за тебя, то перемещения данных из одной области памяти в другую не будет ;) ? Посмотри как в Qtшных классах реализован алгоритм "implicit sharing (copy-on-write)" и сделай также если хватит знаний. |
|||
|
||||
Любитель |
|
|||
Программист-романтик Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 16 Всего: 92 |
Там реализовано через свои макросы, но предоставляется ready to use класс QImplicitSharedDataPointer (может в названии чуть ошибся). С подробным и простым how to use it. Главное консты расставлять на методах - иначе вдобавок к COW будет COR (Copy on reading) |
|||
|
||||
SABROG |
|
|||
Hacker Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Асистент вроде не находит. Нашел только QAtomicInt и QAtomicPointer, но пока не понял их предназначение.
|
|||
|
||||
aspirin2003 |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 111 Регистрация: 18.3.2007 Где: Саратов Репутация: нет Всего: нет |
Прочитал статью Data Sharing with Class. Круто придумано, нечего сказать |
|||
|
||||
SABROG |
|
|||
Hacker Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Так, значит речь идет QSharedData, QSharedDataPointer и QSharedMemory, и QExplicitlySharedDataPointer
Народ, поздравлю всех с Днем Системного Администратора |
|||
|
||||
Любитель |
|
|||
Программист-романтик Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 16 Всего: 92 |
||||
|
||||
aspirin2003 |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 111 Регистрация: 18.3.2007 Где: Саратов Репутация: нет Всего: нет |
Но только в случае, когда методы не модифицируют данные, так? |
|||
|
||||
anatox91 |
|
|||
программист-самоучка Профиль Группа: Участник Сообщений: 699 Регистрация: 12.1.2008 Где: ++Украина.Крым++ Репутация: нет Всего: 13 |
aspirin2003, ну если модифицируют, то можно сделать эти данные mutable, но все конечно зависит от ситуации
-------------------- The code is the design © Sony VAIO VGN-FW480J |
|||
|
||||
aspirin2003 |
|
||||||
Шустрый Профиль Группа: Участник Сообщений: 111 Регистрация: 18.3.2007 Где: Саратов Репутация: нет Всего: нет |
Попробовал переписал класс с использованием QSharedData. Вот примерно то, что получилось:
calcelement.h
calcelement.cpp
MSVC этот код компилит нормально, все работает. А gcc ругается в этой строке:
no match for 'operator=' in 'res = CalcElement::operator+(CalcElement&)(((CalcElement&)(+m1)))' calcelement.cpp Помогите пожалуйста разобраться, в чем косяк. |
||||||
|
|||||||
aspirin2003 |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 111 Регистрация: 18.3.2007 Где: Саратов Репутация: нет Всего: нет |
Ни у кого никаких соображений? Просто надо чтобы программа работала и под Linux тоже, а gcc ругается :(
|
|||
|
||||
nickless |
|
||||
Гентозавр Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 13 Всего: 181 |
aspirin2003, типы операторам надо давать не какие попало, а какие положено
*.h
*.cpp
Это сообщение отредактировал(а) nickless - 28.7.2008, 21:16 -------------------- Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
||||
|
|||||
aspirin2003 |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 111 Регистрация: 18.3.2007 Где: Саратов Репутация: нет Всего: нет |
nickless Спасибо! Все заработало!
|
|||
|
||||
WizardNG |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 15.2.2006 Где: Н. Новгород Репутация: нет Всего: нет |
удалено
Это сообщение отредактировал(а) WizardNG - 26.7.2019, 15:00 |
|||
|
||||
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |