“字段不完整”错误
在我的头文件中有一个错误:
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
您正在使用MainWindowClass
types的前向声明。 这很好,但是这也意味着你只能声明一个指向该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; };
也将工作。
注意两个声明之间的区别。 首先使用前向声明,而第二个实际声明类(这里没有属性和方法)。