crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Проблема с конструктором при создании формы
Delphist
  опции профиля:
сообщение 14.8.2008, 9:46
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 41
Регистрация: 4.8.2008
Из: Россия
Пользователь №: 249

Спасибо сказали: 0 раз(а)




Репутация:   0  


Я хочу в своем классе создать два конструктора:
/******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, то почему форма создается без
дерева, почему это происходи и как сделать чтобы все нормально заработало?

Сообщение отредактировал Delphist - 14.8.2008, 9:49
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 14.8.2008, 9:57
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


это скорее вопрос по С++
Вынеси всю инициализацию в отдельную функцию:
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
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 41
Регистрация: 4.8.2008
Из: Россия
Пользователь №: 249

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

А почему нельзя так как я привел, у нас Delphi без проблем это делает, а тут что за ассемблер
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zamnach
  опции профиля:
сообщение 14.8.2008, 10:08
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 18.7.2008
Пользователь №: 239

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(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
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


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

Насколько я знаю: в С++ в конструкторе можно вызывать конструктор предка, а не другой свой же конструктор. Поэтому следует сделать, как описал Litkevich Yuriy
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 14.8.2008, 10:20
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


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

А ты не путаешь конструктор с обработчиком события типа OnCreate ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 14.8.2008, 10:55
Сообщение #7


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


Delphist, учи матчасть :)
тебе все правильно объяснили zamnach и AD
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrew Selivanov
  опции профиля:
сообщение 26.8.2008, 15:52
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Обобщим? :)
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
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


на русском http://quirks.chat.ru/cpp/faq/#s10p3
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 16.4.2024, 10:34