Russian Qt Forum
Сентябрь 30, 2024, 14:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: Как правильно создать наследника QObject?  (Прочитано 25657 раз)
Shilo
Гость
« : Август 26, 2009, 10:52 »

Добрый день!
Есть два класса - CoordinateSystem и ProjectProperties. Оба унаследованы от QObject.

projectproperties.h
Код
C++ (Qt)
#include <QObject>
 
class CoordinateSystem;
 
class ProjectProperties: public QObject{
   Q_OBJECT
public:
   ProjectProperties(QObject *parent = 0);
   ~ProjectProperties();
 
public slots:
   CoordinateSystem* coordinateSystem()const {return curCoordinateSystem;}
   void setCoordinateSystem(const CoordinateSystem &newCoordinateSystem);
 
private:
   CoordinateSystem* curCoordinateSystem;
};
 

projectproperties.cpp
Код
C++ (Qt)
#include "coordinatesystem.h"
#include "projectproperties.h"
 
ProjectProperties::ProjectProperties(QObject *parent): QObject(parent)
{
   curCoordinateSystem = new CoordinateSystem(this);
}
 
 
void ProjectProperties::setCoordinateSystem(const CoordinateSystem &newCoordinateSystem)
{
   *curCoordinateSystem = newCoordinateSystem; //TRUBLE
}
 

coordinatesystem.h
Код
C++ (Qt)
#include <QObject>
 
class CoordinateSystem : public QObject{
   Q_OBJECT
public:
   CoordinateSystem(QObject *parent = 0);
   ~CoordinateSystem();
 
   QString name() const {return curName;}
   void setName(const QString &newName);
 
signals:
   void nameChanged();
 
private:
   QString curName;
};
 

coordinatesystem.cpp
Код
C++ (Qt)
#include "coordinatesystem.h"
 
CoordinateSystem::CoordinateSystem(QObject *parent): QObject(parent)
{
 
}
 
CoordinateSystem::~CoordinateSystem()
{
 
}
 
void CoordinateSystem::setName(const QString &newName)
{
   curName = newName;
   emit nameChanged();
}
 

main.cpp
Код
C++ (Qt)
#include <QtCore>
#include <QCoreApplication>
#include "coordinatesystem.h"
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
   ProjectProperties properties = new ProjectProperties();
   return a.exec();
}
 

При компиляции выдается сообщение об ошибке
projectproperties.cpp: In member function `CoordinateSystem& CoordinateSystem::operator=(const CoordinateSystem&)':
c:/Qt/4.5.0/include/QtCore/../../src/corelib/kernel/qobject.h:302: error: `QObject& QObject::operator=(const QObject&)' is private
projectproperties.cpp:44: error: within this context

Знаю, что у QObject оператор = и конструктор копирования объявлены в private секции.
Так вот собственно вопрос. Как правильно создать наследника QObject, чтобы подобный код заработал?
Записан
spirit
Гость
« Ответ #1 : Август 26, 2009, 11:12 »

так
Код
C++ (Qt)
ProjectProperties *properties = new ProjectProperties();
 
а еще лучше в стеке (ибо я не вижу где удаляется объект).
Записан
Shilo
Гость
« Ответ #2 : Август 26, 2009, 11:23 »

так
Код
C++ (Qt)
ProjectProperties *properties = new ProjectProperties();
 
а еще лучше в стеке (ибо я не вижу где удаляется объект).
Ладно, пусть так. Но Проблемы это ни как не решает. Компилятор ругается на функцию
Код
C++ (Qt)
void ProjectProperties::setCoordinateSystem(const CoordinateSystem &newCoordinateSystem)
{
   *curCoordinateSystem = newCoordinateSystem;
}
 
в файле projectproperties.cpp
Записан
spirit
Гость
« Ответ #3 : Август 26, 2009, 11:30 »

оператор присваивания запривачен в QObject.
передавай указатель, а не ссылку.
Записан
Shilo
Гость
« Ответ #4 : Август 26, 2009, 11:41 »

Изменил на
Код
C++ (Qt)
void ProjectProperties::setCoordinateSystem(const CoordinateSystem *newCoordinateSystem)
{
   curCoordinateSystem = newCoordinateSystem;
}
 
Теперь компилятор выдает следующее:
projectproperties.cpp: In member function `void ProjectProperties::setCoordinateSystem(const CoordinateSystem*)':
projectproperties.cpp:44: error: invalid conversion from `const CoordinateSystem*' to `CoordinateSystem*'
Записан
SASA
Гость
« Ответ #5 : Август 26, 2009, 11:42 »

Напиши свой (для класса CoordinateSystem) конструктор копирования и оператор присваивания. И будет тебе счастья Подмигивающий
Записан
developer
Гость
« Ответ #6 : Август 26, 2009, 11:44 »

Цитировать
оператор присваивания запривачен в QObject.
передавай указатель, а не ссылку.

Думаю что не поможет. Ты можеш переопределить свой оператор =. А можеш просто сделать новый объект в функции
Код:
void ProjectProperties::setCoordinateSystem()
{
    *curCoordinateSystem = new newCoordinateSystem();
}
Записан
spirit
Гость
« Ответ #7 : Август 26, 2009, 11:45 »

ну конечно будет выдавать, т.к. у тебя указатель в класе не константый, есть два варианта
первый -- убрать const в сигнатуре метода ProjectProperties::setCoordinateSystem,
второй -- приведение по const_cast.
Записан
spirit
Гость
« Ответ #8 : Август 26, 2009, 11:46 »

тролли не просто так заприватили оператор присваивания для QObject.
Записан
developer
Гость
« Ответ #9 : Август 26, 2009, 11:53 »

Лучше убрать const в сигнатуре, потому что некоторые авторы по с++ не рекомендуют использовать const_cast для "обезвреживания" const (почему не знаю, если кто-то отпишет буду признателен).

Кстати в книжке выцарапал правильное переопределение оператора =(ето если нужно)
Код:
String& String::operator=(const String& s1)
{
if (this == &s1) return *this;
delete s;
// Уничтожить предыдущее значение
s = new char[strlen(s1.s) + 1];
strcpy(s, s1.s);
return *this;
}
Записан
spirit
Гость
« Ответ #10 : Август 26, 2009, 11:55 »

Лучше убрать const в сигнатуре, потому что некоторые авторы по с++ не рекомендуют использовать const_cast для "обезвреживания" const (почему не знаю, если кто-то отпишет буду признателен).
потому как сигнатура подразумевает, что объект не будет меняться, а ты внутри функции берешь и снимаешь это ограничение.
Кстати в книжке выцарапал правильное переопределение оператора =(ето если нужно)
Код:
String& String::operator=(const String& s1)
{
if (this == &s1) return *this;
delete s;
// Уничтожить предыдущее значение
s = new char[strlen(s1.s) + 1];
strcpy(s, s1.s);
return *this;
}
еще раз повторю -- тролли не просто так заприватили оператор присваивания.
« Последнее редактирование: Август 26, 2009, 12:04 от spirit » Записан
Shilo
Гость
« Ответ #11 : Август 26, 2009, 12:00 »

тролли не просто так заприватили оператор присваивания для QObject.
Вот и я тоже думаю, что не зря.
ну конечно будет выдавать, т.к. у тебя указатель в класе не константый, есть два варианта
первый -- убрать const в сигнатуре метода ProjectProperties::setCoordinateSystem,
второй -- приведение по const_cast.
Первый вариант: Дык мне надо, чтоб передаваемый в функцтю объект точно не изменялся.
Второй вариант: А я вот не знаю как это делается. Можно пример привести?
Записан
developer
Гость
« Ответ #12 : Август 26, 2009, 12:04 »

to Spirit

спасибо  Подмигивающий
Записан
developer
Гость
« Ответ #13 : Август 26, 2009, 12:06 »

const int* b = &a;
int* c = const_cast<int*>(b);
Записан
developer
Гость
« Ответ #14 : Август 26, 2009, 12:07 »

После етого "b"  "теряет" свою константность
Записан
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.195 секунд. Запросов: 21.