|
|
|
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 |
||||
|
|||||
Правила форума "С/С++: Кроссплатформенное программирование, 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. |