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)
工作没有任何错误.在第一种方法中我的错误是什么?
类定义必须位于您声明该类的同一名称空间中.
至于Qt示例,在命名空间外声明的MainWindow 不是同一个类.
它使用了Pimpl成语.在名称空间中声明的MainWindow类用作在外部声明的MainWindow类中的成员,并使用其名称空间进行限定:
Ui::MainWindow* ui;
Run Code Online (Sandbox Code Playgroud)
此类的定义放在其他位置(在不同的.cpp文件中),它应位于Ui
命名空间中,或者带有前缀为命名空间的定义.
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::MainWindow
和MainWindow
在全局名称空间中。那个在Ui
只进行了申报,所以是不完整的报头。您可以使用它执行各种操作,例如声明指向它的指针,但是无法实例化它。
大概有一个单独的源文件,该文件定义Ui
该类,实例化该类并设置指向该类的指针。
顺便说一句,您不应将保留名称用于包含保护或其他任何内容。此外,的返回类型main
必须为int
。