Qt - 错误:ISO C ++禁止声明'MainWindow'没有类型

时间:2011-12-09 07:04:56

标签: qt qt-creator

首先,我经过大量的搜索,阅读和调试后发布了这个问题......但是无法解决问题。

我有两个类MainWindow和Controller,它们都需要包含另一个。我试图解决递归包括使用转发的问题,但它没有用。 我认为在使用名称空间实现转发方面存在一些问题。

两个类的代码:(我试图尽可能缩短代码)

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtCore>
#include "controller.h"


namespace Ui {
    class MainWindow;
}


class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void addRadioButtons();
    void changeViewQML(QString);
    void changeViewXML(QString);

private:
    Ui::MainWindow *ui;
    controller controllerObj;
};

#endif // MAINWINDOW_H

或者Controller.h

#ifndef CONTROLLER_H
#define CONTROLLER_H

#include <QtCore>
#include "mainwindow.h"


class controller : public QThread
{
public:
    controller();
    void response_handler(QString);

private:
    MainWindow *viewObj;

protected:
    void run();

};

#endif // CONTROLLER_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"   

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::changeViewQML(QString s)
{
    qDebug(s.toAscii());
}

controller.cpp

#include "controller.h"

controller::controller()
{
}

void controller::response_handler(QString responseFilePath)
{
    viewObj->changeViewQML(responseFilePath);
}

我一直有这个ISO错误。

对不起长代码,如果任何部分不够清楚

1 个答案:

答案 0 :(得分:0)

向前宣布MainWindow。更换 controller.h中的#include "mainwindow.h"

namespace Ui {
    class MainWindow;
}

也可以在控制器中将其称为Ui::MainWindow *viewObj;或写入using namespace Ui

修改

这编译好了:

<强> mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtCore>
#include "controller.h"

namespace Ui{
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void addRadioButtons();
    void changeViewQML(QString);
    void changeViewXML(QString);

private:
    Ui::MainWindow *ui;
    controller controllerObj;
};

#endif // MAINWINDOW_H

<强>或者Controller.h

#ifndef CONTROLLER_H
#define CONTROLLER_H

#include <QtCore>
//#include "mainwindow.h"
class MainWindow;


class controller : public QThread
{
public:
    controller();
    void response_handler(QString);

private:
    MainWindow *viewObj;

protected:
    void run();

};

#endif // CONTROLLER_H

<强> mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::changeViewQML(QString s)
{
    qDebug(s.toAscii());
}

<强> controller.cpp

#include "controller.h"
#include "mainwindow.h"

controller::controller()
{
}

void controller::run()
{
}

void controller::response_handler(QString responseFilePath)
{
    viewObj->changeViewQML(responseFilePath);
}