我有一个对话框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。如有必要,向前声明设置。经验法则是仅在必要时才包含在标头中,并在可能的情况下正向声明。

09-18 03:14