"字段类型不完整"错误

Isa*_*laW 70 c++

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

field "ui" has incomplete type.
Run Code Online (Sandbox Code Playgroud)

我试过制作ui指针,但这不起作用.我不认为我需要这样做,因为我已经MainWindowClass在命名空间中定义了我Ui.这是我的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
Run Code Online (Sandbox Code Playgroud)

Ed *_* S. 93

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

所以,你要么想要:

// forward declaration, details unknown
class A;

class B {
  A *a;  // pointer to A, ok
};
Run Code Online (Sandbox Code Playgroud)

或者,如果你不能使用指针或参考....

// declaration of A
#include "A.h"

class B {
  A a;  // ok, declaration of A is known
};
Run Code Online (Sandbox Code Playgroud)

在某些时候,编译器需要知道的细节A.

如果您只存储指针,A则在声明时不需要这些细节B.它在某些时候需要它们(每当你实际取消引用指针时A),这可能在实现文件中,你需要包含包含类声明的头A.

// B.h
// 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 "B.h"
#include "A.h"  // declaration of A

B::foo() {
    // here we need to know the declaration of A
    a->whatever();
}
Run Code Online (Sandbox Code Playgroud)


Mac*_*ade 15

问题是您的ui属性使用类 的前向声明Ui::MainWindowClass,因此出现"不完整类型"错误.

包括声明此类的头文件将解决问题.

编辑

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

namespace Ui
{
    class MainWindowClass;
}
Run Code Online (Sandbox Code Playgroud)

确实不声明一个类.这是一个前向声明,意味着该类将在某个时刻,在链接时存在.
基本上,它只是告诉编译器类型将存在,并且它不应该警告它.

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

请注意,只有指向此类型的指针才能生效.
您不能拥有静态分配的不完整类型的实例.

所以要么你实际上想要一个不完整的类型,然后你应该将你的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;
};
Run Code Online (Sandbox Code Playgroud)

或者你想要一个静态分配的实例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;
};
Run Code Online (Sandbox Code Playgroud)

也会工作.

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