我有一个对话框窗口settings
,我希望显示breadData
对象中的所有值,为此我希望settings
继承breadData
的受保护的成员我尝试转发declare 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
不是结构,为什么编译器认为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
//.....
答案 0 :(得分:1)
你有一个循环依赖。 breaddata.h在声明breaddata之前包含settings.h。 settings.h需要声明继承的breaddata。
因此,在编译包含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。如有必要,请转发声明设置。经验法则是只在你必须时包括在标题中,并且只要你可以转发声明。
答案 1 :(得分:1)
您的问题是您对以下内容的理解不完整:
namespace
s 如果不了解您的代码而不是您所展示的代码,以下内容应该可以解决您的问题:
settings.h
#ifndef SETTINGS_H
#define SETTINGS_H
// Your code as above
#endif
breaddata.h
#ifndef BREADDATA_H
#define BREADDATA_H
// Your code as above
#endif
resultWnd.h
#ifndef RESULTWND_H
#define RESULTWND_H
// Your code as above
#endif
我怀疑这不会完全解决你的问题。根据您的第二条错误消息,我怀疑您已经遗漏了重要的代码行,因此没有人能够给您一个明确的答案来解决您的问题。
我建议您修改问题中的代码,以包含包含breadData
,Settings
和resultWnd
可以解决这个问题,我们只需要看看三个类是如何绑定在一起的,这样我们就可以帮助你解开它们。
编译器认为您使用struct
的原因纯粹是历史性的。 class
关键字是在C ++中引入的,目的是替换struct
。以前,在C中,只存在struct
关键字。据我所知,struct
和class
es之间的唯一区别是默认访问级别。 class
默认为private
,而struct
默认为public
。否则,它们的用法相同。