我有一个对话框settings
,我想显示breadData
对象中的所有值,为此,我想让settings
继承breadData
受保护的成员。我尝试转发声明的BreadData,但是我的代码出现了几个错误。
/home/--/breadPull/prj/settings.h:14: error: invalid use of incomplete type 'struct breadData'
/home/--/breadPull/prj/resultwnd.h:7: error: forward declaration of 'struct breadData'
例如,
breadData
不是结构,为什么编译器认为面包数据是结构?其次,我不明白第二行要说的是什么。我唯一的猜测是因为我的程序中有很多循环依赖项。以下是相关代码:settings.h
#include <QDialog>
#include "breaddata.h"
class breadData;
namespace Ui {
class Settings;
}
class Settings : public QDialog, public breadData
{
Q_OBJECT
//.....
BreadData.h
#include <vector>
#include <string>
#include <QtWidgets>
#include <QMainWindow>
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "resultwnd.h"
#include "settings.h"
class MainWindow;
class resultWnd;
class breadData
{
public:
breadData(std::string);
~breadData();
//read in data file that provides all information
bool readData();
//.......
resultWnd.h
include <QGroupBox>
#include "breaddata.h"
class breadData;
namespace Ui {
class resultWnd;
}
class resultWnd : public QGroupBox
//.....
最佳答案
您具有循环依赖关系。声明面包数据之前,breaddata.h包含settings.h。 settings.h需要声明breaddata来进行继承。
因此,预处理器在编译包含面包数据的文件时首先创建的文件如下所示(缩进以可视化方式包括所包含的头文件):
<content of breaddata.h>:
<content of vector, string, QtWidget, QMainWindow, mainwindow.h and ui_mainwindow.h>
...
<content of resultWnd>:
...
class breaddata; //forward declaration mentioned in the error message
...
<content of settings.h>:
...
class Settings : public QDialog, public breadData //DANG!
...
class breaddata { ... //too late
总结:
class breaddata; //forward declaration mentioned in the error message
...
class Settings : public QDialog, public breadData //DANG!
...
class breaddata { ... //too late
解决方案是避免在Breaddata.h中包含,尤其是settings.h。如有必要,向前声明设置。经验法则是仅在必要时才包含在标头中,并在可能的情况下正向声明。