0

我有一个对话框窗口settings,我想显示我的breadData对象的所有值,为此我希望拥有settingsinheritbreadData的受保护成员。我尝试转发声明 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 是结构?其次,我不明白第二行想说什么。我唯一的猜测是因为我的程序中有很多循环依赖。以下是相关代码:

设置.h

#include <QDialog>
#include "breaddata.h"

class breadData;

namespace Ui {
class Settings;
}

class Settings : public QDialog, public breadData
{
    Q_OBJECT
    //.....

面包数据.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();

    //.......

结果Wnd.h

include <QGroupBox>
#include "breaddata.h"

class breadData;

namespace Ui {
class resultWnd;
}

class resultWnd : public QGroupBox
//.....
4

2 回答 2

1

你有一个循环依赖。breaddata.h 在声明面包数据之前包含 settings.h。settings.h 需要为继承声明面包数据。

因此,在编译包含面包数据的文件时,预处理器创建的文件首先看起来像这样(缩进以可视化包含的头文件的递归插入):

<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。如有必要,前向声明设置。经验法则是仅在必须时才包含在标头中,并尽可能前向声明。

于 2013-10-29T19:42:15.893 回答
1

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

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

在不了解您的代码而不是您所显示的内容的情况下,以下内容应该可以解决您的问题:

设置.h

#ifndef SETTINGS_H
#define SETTINGS_H

// Your code as above

#endif

面包数据.h

#ifndef BREADDATA_H
#define BREADDATA_H

// Your code as above

#endif

结果Wnd.h

#ifndef RESULTWND_H
#define RESULTWND_H

// Your code as above

#endif

我怀疑这不会完全解决您的问题。根据您的第二条错误消息,我怀疑您已将重要的代码行排除在问题之外,因此没有人能够为您提供明确的答案来解决您的问题。

我建议您编辑问题中的代码以包含所有包含breadData,SettingsresultWnd

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



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

于 2013-10-30T06:58:08.963 回答