2

我知道这个话题已经讨论过了,但是我花了半天时间来弄清楚我做错了什么。我一直有这个错误,我想我已经做了数千次语法检查。谁能帮我?

#ifndef ADDEDITDIALOG_H
#define ADDEDITDIALOG_H

#include <QDialog>
#include <QStandardItemModel>
#include "characteristics.h"
#include "equipment.h"
#include "generaldata.h"
#include "registration.h"
#include "revisiondialog.h"
#include "vehicle.h"
#include "vehiclehelper.h"
#include "verification.h"
#include "verificationdialog.h"


namespace Ui {
class AddEditDialog;
}

class AddEditDialog : public QDialog
{
Q_OBJECT

public:
explicit AddEditDialog(QWidget *parent = 0);
~AddEditDialog();

bool getIsNew() const;
bool getIsEdited() const;
bool getAddRevision() const;

Vehicle getVehicleToAdd() const;

void setVehicleToAdd();
void loadVehicleToEdit(Vehicle car);
void createTableView(const QList<Verification> list);

QList<Verification> getRevisionsList() const;

private slots:
void on_add_revision_clicked();

void on_save_clicked();

void on_cancel_clicked();

void on_generate_reg_number_clicked();

private:
Ui::AddEditDialog *ui;
RevisionDialog *newDialog; //this line is giving the error

Vehicle toAdd;

bool isNew;
bool isEdited;
bool addRevision;

QList<Verification> newVerificationList;
QStandardItemModel *newModel;
};

#endif // ADDEDITDIALOG_H

修订对话框.h

#ifndef REVISIONDIALOG_H
#define REVISIONDIALOG_H

#include <QDialog>
#include "addeditdialog.h"
#include "verification.h"

namespace Ui {
class RevisionDialog;
}

class RevisionDialog : public QDialog
{
Q_OBJECT

public:
explicit RevisionDialog(QWidget *parent = 0);
~RevisionDialog();

void setRevision();
void setRevisionsList();
Verification getRevision() const;
bool getOk() const;

private slots:
void on_ok_revision_clicked();

void on_cancel_revision_clicked();

private:
Ui::RevisionDialog *ui;
QList<Verification> revisionsList;
Verification revision;
bool okClicked;
};

#endif // REVISIONDIALOG_H
4

2 回答 2

5

RevisionDialog是未定义的类型。

我看到你包括

#include "revisiondialog.h"

在顶部,它应该定义RevisionDialog.

但是,显然您设法创建了一个循环包含依赖项,这意味着您revisiondialog.haddeditdialog.h直接或间接地包含了您的(如果是产生错误的标头的名称)。

包含守卫打破了包含循环,导致一个圆形标头首先被物理包含,另一个被物理包含在第二个。在您的情况下addeditdialog.h,首先包含在内,这就是为什么它对revisiondialog.h.

摆脱循环包含依赖。在你这样做之前,尝试其他任何事情都是没有意义的。

PS现在,正如您发布的内容,revisiondialog.h很明显它还包括addeditdialog.h. 这是你的问题。

为什么你的revisiondialog.h包括addeditdialog.h?那有什么需要?

于 2013-09-27T21:13:28.460 回答
4

如前所述,您包含了不必要的头文件。我想对这个问题补充一些想法。

不需要时不要在 .h 文件中包含标题。

将它们移动到 .cpp 文件。您只需要 QDialog、QStandardItemModel、Vehicle 和 Verification,其余的可以移动到 .cpp 文件中。尽量减少循环包含依赖的可能性是一个好习惯

#include <QDialog>
#include <QStandardItemModel>
//#include "characteristics.h"
//#include "equipment.h"
//#include "generaldata.h"
//#include "registration.h"
//#include "revisiondialog.h"
#include "vehicle.h"
//#include "vehiclehelper.h"
#include "verification.h"
//#include "verificationdialog.h"

对于 RevisionDialog,当您仅使用指向类的指针时,使用提到的前向声明。

RevisionDialog *newDialog; // this is only pointer -> no need to include header file

前向声明:

namespace Ui {
    class AddEditDialog; // this is forward declaration within Ui namespace
}

class RevisionDialog; // added forward declaration for RevisionDialog *newDialog;

class AddEditDialog : public QDialog
{
Q_OBJECT

当您在头文件中仅使用指针时,最好使用前向声明

于 2013-09-27T21:49:35.313 回答