“字段不完整”错误

在我的头文件中有一个错误:

field "ui" has incomplete type. 

我已经尝试使用ui指针,但是这不起作用。 我不认为我需要这样做,因为我已经在命名空间Ui定义了我的MainWindowClass 。 这是我的mainwindow.h

 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QtGui/QMainWindow> #include "ui_mainwindow.h" namespace Ui { class MainWindowClass; } class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0, Qt::WFlags flags=0); ~MainWindow(); public slots: void slideValue(int); private: Ui::MainWindowClass ui; //error line }; #endif // MAINWINDOW_H 

您正在使用MainWindowClasstypes的前向声明。 这很好,但是这也意味着你只能声明一个指向该types的指针或引用。 否则,编译器不知道如何分配父对象,因为它不知道前向声明types的大小(或者实际上是否有无参数的构造函数等)

所以,你要么:

 // forward declaration, details unknown class A; class B { A *a; // pointer to A, ok }; 

或者,如果你不能使用指针或引用….

 // declaration of A #include "Ah" class B { A a; // ok, declaration of A is known }; 

在某个时刻,编译器需要知道A的细节。

如果只存储指向A的指针,则在声明B时不需要这些细节。 它需要在某个时刻(无论何时将指针实际引用到A ),这可能在实现文件中,您将需要包含包含类A的声明的头。

 // Bh // header file // forward declaration, details unknown class A; class B { public: void foo(); private: A *a; // pointer to A, ok }; // B.cpp // implementation file #include "Bh" #include "Ah" // declaration of A B::foo() { // here we need to know the declaration of A a->whatever(); } 

问题是你的ui属性使用类Ui::MainWindowClass前向声明 ,因此“不完整types”错误。

包括声明这个类的头文件将解决这个问题。

编辑

根据您的评论,以下代码:

 namespace Ui { class MainWindowClass; } 

不宣布一个类。 这是一个前向声明 ,这意味着class级将在某个时间点存在。
基本上,它只是告诉编译器该types将存在,它不应该警告它。

但是这个类必须在某个地方定义

注意这只有在你有一个指向这种types的指针时才能工作。
您不能有一个不完整types的静态分配的实例。

所以要么你真的想要一个不完整的types,然后你应该声明你的ui成员是一个指针:

 namespace Ui { // Forward declaration - Class will have to exist at link time class MainWindowClass; } class MainWindow : public QMainWindow { private: // Member needs to be a pointer, as it's an incomplete type Ui::MainWindowClass * ui; }; 

或者你想要一个静态分配的Ui::MainWindowClass实例,然后它需要声明。 你可以在另一个头文件中完成(通常,每个类有一个头文件)。
但只需将代码更改为:

 namespace Ui { // Real class declaration - May/Should be in a specific header file class MainWindowClass {}; } class MainWindow : public QMainWindow { private: // Member can be statically allocated, as the type is complete Ui::MainWindowClass ui; }; 

也将工作。

注意两个声明之间的区别。 首先使用前向声明,而第二个实际声明类(这里没有属性和方法)。