我有四个文件:
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消息。我怎么能这样做,存在一个模式或者为此做什么?
如何解决这个问题或者我在思考错误的地方?
感谢您的帮助。
答案 0 :(得分:2)
你有一个循环依赖。您不能URI
包含information.h
而也 mainwindow.h
包含mainwindow.h
。您应该在层次结构中设计依赖项,其中树中较低的项不包括树中较高的项。
您应该查看此链接,以便更好地了解如何构建对象:
答案 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所提到的那样,总是首选删除循环依赖,但并非总是如此。