crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Переопределение конструктора
alzasr
  опции профиля:
сообщение 14.12.2012, 8:59
Сообщение #1


Студент
*

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

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




Репутация:   0  


Есть классы
class MyClass: public QMainWindow{
    Q_OBJECT
public:
    explicit MyClass(QWidget *parent=0);
    ~MyClass();
}

class MyClass2: public QWidget{
    Q_OBJECT
public:
    explicit MyClass2(QWidget *parent=0);
    ~MyClass2();
}


мне надо, что бы в конструктор MyClass2 в качестве родителя передавался не просто QWidget, а MyClass, т.е.
    MyClass2(MyClass *parent=0) : QWidget(parent) {};

но при сборке выходит ошибка, что MyClass* не может быть преобразован в QWidget*. Можно конечно конструктор сделать так
    MyClass2(QWidget *parent=0,MyClass *myclass = 0) : QWidget(parent) {this->myclass = myclass};

добавив в класс переменную MyClass *myclass;
Экземпляр класс MyClass2 создается в MyClass, т.е. вызов конструктора будет myclass2 = new MyClass2(this,this);
Но мне интересно, почему не работает конструкция с 1 параметром?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 14.12.2012, 9:29
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

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




Репутация:   1  


MyClass2(MyClass *parent=0) : QWidget(parent) {};
Вообще-то этот код компилируется

Сообщение отредактировал mezmay - 14.12.2012, 9:49
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
alzasr
  опции профиля:
сообщение 14.12.2012, 10:21
Сообщение #3


Студент
*

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

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




Репутация:   0  


Приношу извинения, я не совсем правильно описал ситуацию.
У меня 2 класса определены в 2 заголовочных файлах. Оба инклюдят друг друга, Вот пример

MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "tt.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H


tt.h
#ifndef TT_H
#define TT_H

#include <QWidget>

#include "mainwindow.h"

class tt : public QWidget
{
    Q_OBJECT
public:
    explicit tt(QWidget *parent = 0);
    tt(MainWindow *parent = 0);
    
signals:
    
public slots:
    
};

#endif // TT_H


в этом случае происходит ошибка /media/user/workspace/test2-build-desktop-Desktop_Qt_4_8_1_for_GCC__Qt_SDK_______/../test2/tt.h:12: ошибка: expected ')' before '*' token

Я пробовал заменять #include "mainwindow.h" в tt.h на class MainWindow; ошибка /media/user/workspace/test2-build-desktop-Desktop_Qt_4_8_1_for_GCC__Qt_SDK_______/../test2/tt.cpp:9: ошибка: no matching function for call to 'QWidget::QWidget(MainWindow*&)'
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 14.12.2012, 10:38
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

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




Репутация:   1  


Так не делают, двойной инклюд делать нельзя, и вообще это плохое решение. Но можно

в tt.h
вместо
#include "mainwindow.h"

сделать
class MainWinow;
т.к. тебе в tt.h тебе нужен только указатель,
а в tt.cpp уже сделать
#include "mainwindow.h"


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

Сообщение отредактировал mezmay - 14.12.2012, 10:39
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
alzasr
  опции профиля:
сообщение 14.12.2012, 10:48
Сообщение #5


Студент
*

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

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




Репутация:   0  


Спасибо, помогло.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 22.11.2024, 15:59