Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ С\С++ _ Проблема с конструктором при создании формы

Автор: Delphist 14.8.2008, 9:46

Я хочу в своем классе создать два конструктора:

/******MyClass.h********/

class MyClass : public QMainWindow
{
    Q_OBJECT

public:
    MyClass(QWidget *parent = 0, Qt::WFlags flags = 0);                             //конструктор №1
    MyClass(CSharedV &v, QWidget *parent = 0, Qt::WFlags flags = 0);  //конструктор №2
...
}

    
/******MyClass.cpp******/

MyClass::MyClass(QWidget *parent, Qt::WFlags flags)
    :QMainWindow(parent, flags)
{
    sharedDataModel = new SharedDataModel(this);
    ui.setupUi(this);    
    ui.treeView->setModel(sharedDataModel);
    ui.treeView->header()->setResizeMode(0, QHeaderView::Stretch);
    ui.treeView->header()->setResizeMode(1, QHeaderView::Stretch);
}

MyClass::MyClass(CSharedV &v, QWidget *parent, Qt::WFlags flags)
    :QMainWindow(parent, flags)
{
     MyClass(parent, flags);
    setShared(v);
}


Прикол в том что если я вызываю конструктор№2, то почему форма создается без
дерева, почему это происходи и как сделать чтобы все нормально заработало?

Автор: Litkevich Yuriy 14.8.2008, 9:57

это скорее вопрос по С++
Вынеси всю инициализацию в отдельную функцию:

void MyClass::Init()
{
    sharedDataModel = new SharedDataModel(this);
    ui.setupUi(this);    
    ui.treeView->setModel(sharedDataModel);
    ui.treeView->header()->setResizeMode(0, QHeaderView::Stretch);
    ui.treeView->header()->setResizeMode(1, QHeaderView::Stretch);
}

и ее вызывай в обоих кострукторах

Автор: Delphist 14.8.2008, 10:05

Цитата(Litkevich Yuriy @ 14.8.2008, 9:57) *
это скорее вопрос по С++
Вынеси всю инициализацию в отдельную функцию:

А почему нельзя так как я привел, у нас Delphi без проблем это делает, а тут что за ассемблер

Автор: zamnach 14.8.2008, 10:08

Цитата(Delphist @ 14.8.2008, 10:46) *
Я хочу в своем классе создать два конструктора:
/******MyClass.cpp******/
MyClass::MyClass(CSharedV &v, QWidget *parent, Qt::WFlags flags)
    :QMainWindow(parent, flags)
{
     MyClass(parent, flags);
    setShared(v);
}


Присоединюсь к Юрию и добавлю, что во втором конструкторе создается экземпляр класса MyClass (с помощью конструктора№1).
По выходу из конструктора №2 этот экземпляр благополучно прибивается.

Автор: AD 14.8.2008, 10:16

Цитата(Delphist @ 14.8.2008, 11:05) *
А почему нельзя так как я привел, у нас Delphi без проблем это делает, а тут что за ассемблер

Насколько я знаю: в С++ в конструкторе можно вызывать конструктор предка, а не другой свой же конструктор. Поэтому следует сделать, как описал Litkevich Yuriy

Автор: Litkevich Yuriy 14.8.2008, 10:20

Цитата(Delphist @ 14.8.2008, 14:05) *
у нас Delphi без проблем это делает

А ты не путаешь конструктор с обработчиком события типа OnCreate ?

Автор: void* 14.8.2008, 10:55

Delphist, учи матчасть :)
тебе все правильно объяснили zamnach и AD

Автор: Andrew Selivanov 26.8.2008, 15:52

Обобщим? :)
1) Конструктор это не функция, его нельзя вызвать.
2) Это ограничение есть в C++, в Java его нет (можно использовать такие штуки как this(), super() )
3) Может быть ограничение уберут в upcoming стандарте.

А вообще это вопрос из замечательного FAQ:
http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.3

Автор: Litkevich Yuriy 26.8.2008, 16:19

на русском http://quirks.chat.ru/cpp/faq/#s10p3

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)