使用包含B类B

时间:2018-03-13 09:08:56

标签: c++ qt

我有四个文件:

mainwindow.h

#pragma once // MAINWINDOW_H

#include <QMainWindow>
#include <QApplication>
#include "maincontent.h"

class MainWindow : public QMainWindow
{
        Q_OBJECT
    public:
        explicit MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
        void setStatusBarMessage(QString message);

    signals:

    public slots:
        void exit();

    private:
        void setMenuBar();
        MainContent* content;
};

maincontent.h

#pragma once // MAINCONTENT_H

#include "statistic.h"
#include "information.h"
#include <QWidget>
#include <QHBoxLayout>

class MainContent : public QWidget
{
        Q_OBJECT
    public:
        explicit MainContent(QWidget *parent = nullptr);

    signals:

    public slots:

    private:
        QHBoxLayout* layout;
        Statistic* statistic;
        Information* financFlow;
};

information.h

#pragma once // INFORMATION_H

#include <QPushButton>
#include <QWidget>
//#include "mainwindow.h" //error

class Information : public QWidget
{
        Q_OBJECT
    public:
        explicit Information(QWidget *parent = nullptr);

    signals:

    public slots:

    private:
        QPushButton* button;
};

statistic.h

#pragma once // STATISTIC_H

#include <QWidget>
#include <QHBoxLayout>
#include <QListView>

class Statistic : public QWidget
{
        Q_OBJECT
    public:
        explicit Statistic(QWidget *parent = nullptr);

    signals:

    public slots:

    private:
        QListView* listView;
};

现在我将使用MainWindow::setStatusBarMessage类中的Information方法。

但是当我在信息类中加入MainWindow时:#include "mainwindow.h"
我在mainwindow.h的第22行变成了错误:MainContent does not name a type

首先我不知道为什么编译器在MainContent中找不到MainWindow,因为我包含了“maincontent.h”,预处理器只包含“mainwindow.h”而不是“mainwindow.h”中的“maincontent.h”?

我看到#include "mainwindow.h"出现递归,但由于#pragma once或?

,这不应该是一个问题

接下来我尝试在info.cpp文件中包含“mainwindow.h”但是我遇到的问题是我每次都按参数提供MainWindow对象而不能保持MainWindow在我班上

我的主要问题是MainWindow有一个statusBar对象,我将从任何地方设置statusBar消息。我怎么能这样做,存在一个模式或者为此做什么?

如何解决这个问题或者我在思考错误的地方?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

你有一个循环依赖。您不能URI包含information.h mainwindow.h包含mainwindow.h。您应该在层次结构中设计依赖项,其中树中较低的项不包括树中较高的项。

您应该查看此链接,以便更好地了解如何构建对象:

https://en.wikipedia.org/wiki/Circular_dependency

答案 1 :(得分:2)

您应该为所包含的课程使用前瞻性声明。由于指针本身不需要知道完全声明的类(指针大小始终相同),因此您可以轻松解决此问题:

在头文件中而不是包含该类只是声明它:

#include <QMainWindow>
#include <QApplication>
//#include "maincontent.h" // REmove these
class MainContent;
class MainWindow : public QMainWindow
{
        Q_OBJECT
    public:
        explicit MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
        void setStatusBarMessage(QString message);

    signals:

    public slots:
        void exit();

    private:
        void setMenuBar();
        MainContent* content;
};

现在在cpp文件中再次包含标题。为所有人做这包括只有指向给定类的指针。

正如@dempzorz所提到的那样,总是首选删除循环依赖,但并非总是如此。