多重继承错误'无效使用不完整类型'

时间:2013-10-29 19:13:00

标签: c++ qt multiple-inheritance circular-dependency

我有一个对话框窗口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
//.....

2 个答案:

答案 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)

您的问题是您对以下内容的理解不完整:

  1. 预编译器
  2. 声明和定义之间的区别以及使用前者的目的。
  3. namespace s
  4. 的目的和用途

    如果不了解您的代码而不是您所展示的代码,以下内容应该可以解决您的问题:

    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
    

    我怀疑这不会完全解决你的问题。根据您的第二条错误消息,我怀疑您已经遗漏了重要的代码行,因此没有人能够给您一个明确的答案来解决您的问题。

    我建议您修改问题中的代码,以包含包含breadDataSettingsresultWnd

    的所有行

    可以解决这个问题,我们只需要看看三个类是如何绑定在一起的,这样我们就可以帮助你解开它们。



    编译器认为您使用struct的原因纯粹是历史性的。 class关键字是在C ++中引入的,目的是替换struct。以前,在C中,只存在struct关键字。据我所知,structclass es之间的唯一区别是默认访问级别。 class默认为private,而struct默认为public。否则,它们的用法相同。