在命名空间中定义类的方法

QT-*_*elp 3 c++ qt namespaces class

我在头文件中的命名空间中定义了一个类,如下所示

#ifndef _c1_
#define _c1_

namespace classspace
{
    class Aclass;
}

class Aclass
{
    //body
};

#endif _c1_
Run Code Online (Sandbox Code Playgroud)

我将这个标题添加到main.cpp并在main()中创建了一个对象但是它的返回错误是undefined class 'classspace::Aclass' 我的主要文件

void main()
{
    classspace::Aclass b;
}
Run Code Online (Sandbox Code Playgroud)

当我把课定义为

class classspace::Aclass
{
    //body
};
Run Code Online (Sandbox Code Playgroud)

错误已解决.我在Qt mainwindow文件中看到了第一种方法:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
Run Code Online (Sandbox Code Playgroud)

工作没有任何错误.在第一种方法中我的错误是什么?

JBL*_*JBL 8

类定义必须位于您声明该类的同一名称空间中.

至于Qt示例,在命名空间外声明的MainWindow 不是同一个类.

它使用了Pimpl成语.在名称空间中声明的MainWindow类用作在外部声明的MainWindow类中的成员,并使用其名称空间进行限定:

Ui::MainWindow* ui;
Run Code Online (Sandbox Code Playgroud)

此类的定义放在其他位置(在不同的.cpp文件中),它应位于Ui命名空间中,或者带有前缀为命名空间的定义.


Mik*_*our 5

namespace classspace
{
    class Aclass;
}
Run Code Online (Sandbox Code Playgroud)

这将在名称空间内声明一个类。

class Aclass
{
    //body
};
Run Code Online (Sandbox Code Playgroud)

这将在全局名称空间中声明并定义具有相同名称的其他

class classspace::Aclass
{
    //body
};
Run Code Online (Sandbox Code Playgroud)

这定义了您先前在名称空间中声明的类。

void main()
{
    classspace::Aclass b;
}
Run Code Online (Sandbox Code Playgroud)

这试图实例化在命名空间中声明的类。如果尚未定义(仅声明)该类,则该类不完整且无法实例化。

Qt示例涉及两个类:Ui::MainWindowMainWindow在全局名称空间中。那个在Ui只进行了申报,所以是不完整的报头。您可以使用它执行各种操作,例如声明指向它的指针,但是无法实例化它。

大概有一个单独的源文件,该文件定义Ui该类,实例化该类并设置指向该类的指针。

顺便说一句,您不应将保留名称用于包含保护或其他任何内容。此外,的返回类型main必须为int