C++ 在命名空间中定义类的方法
我在标题中的命名空间中定义了一个类,如下所示C++ 在命名空间中定义类的方法,c++,qt,class,namespaces,C++,Qt,Class,Namespaces,我在标题中的命名空间中定义了一个类,如下所示 #ifndef _c1_ #define _c1_ namespace classspace { class Aclass; } class Aclass { //body }; #endif _c1_ 我将这个头添加到main.cpp,并在main()中创建了一个对象,但返回的错误是未定义的类'classspace::Aclass' 这是我的主要工作 void main() { classspace::Aclass
#ifndef _c1_
#define _c1_
namespace classspace
{
class Aclass;
}
class Aclass
{
//body
};
#endif _c1_
我将这个头添加到main.cpp,并在main()中创建了一个对象,但返回的错误是未定义的类'classspace::Aclass'
这是我的主要工作
void main()
{
classspace::Aclass b;
}
当我把类定义为
class classspace::Aclass
{
//body
};
错误已解决。
我使用第一种方法在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
\ifndef主窗口
#定义主窗口
#包括
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
私人:
Ui::MainWindow*Ui;
};
#endif//main窗口
正在工作,没有任何错误。
第一种方法中我的错误是什么
namespace classspace
{
class Aclass;
}
class Aclass
{
//body
};
这两个类是两个不同的类(名称相同)
您正在使用尚未定义的classspace::Aclass
。在名称PCE中添加正文:
namespace classspace
{
class Aclass
{
//body
};
}
在命名空间内声明类,但在命名空间外定义它。因此,宣言是:
classspace::Aclass
但定义定义了以下各项的实施:
::Aclass
名称空间应该与声明和定义匹配。名称空间本质上是包。在您的Qt示例中,类是前向声明的。使用名称空间的一种方法如下:
namespace MyNamespace
{
class MyClass
{
};
}
如果您想像您的第一个示例那样执行它,那么您必须向前声明它。比如说,
namespace MyNamespace
{
class MyClass;
}
class MyClass
{
//body
};
这将在命名空间内声明一个类
class Aclass
{
//body
};
void main()
{
classspace::Aclass b;
}
这将在全局命名空间中声明并定义具有相同名称的不同类
class classspace::Aclass
{
//body
};
这定义了以前在命名空间中声明的类
class Aclass
{
//body
};
void main()
{
classspace::Aclass b;
}
这将尝试实例化命名空间中声明的类。如果尚未定义(仅声明)该类,则该类不完整,无法实例化
Qt示例涉及两个类:Ui::MainWindow
,以及全局命名空间中的MainWindow
。Ui
中的一个仅被声明,因此在标题中不完整。可以使用它执行各种操作,例如声明指向它的指针,但不能实例化它
大概有一个单独的源文件,它定义Ui
类,实例化一个类,并设置指向它的指针
顺便说一句,你不应该使用你的包括警卫,或其他任何东西。另外,main
的返回类型必须是int
namespace foo
{
class AClass;
}
namespace goo
{
class AClass;
}
class AClass
{
}
int main()
{
AClass myClass;
}
我们用哪一个<代码>foo或goo
您必须通过使用名称空间名称调用AClass的所有用法(即foo::AClass
)或将其所有用法放在
namespace foo
{
}
该类定义必须与您在其中声明该类的命名空间相同 至于Qt示例,在名称空间之外声明的MainWindow不是同一个类 它使用。命名空间中声明的MainWindow类用作在外部声明的MainWindow类中的成员,并使用其命名空间限定:
Ui::MainWindow* ui;
此类的定义放在另一个地方(在不同的.cpp文件中),它应该位于
Ui
命名空间中,或者定义前缀为命名空间。您可以显示Qt源代码吗?请再次查看问题我已经添加了它。您没有在头文件中“定义”Aclass
。你宣布了。有什么特别的原因让你投否决票吗?我想纠正我犯的任何错误。是的-他回答了你的问题,你的类是在名称空间之外定义的,它不是同一个类谢谢!!甚至我检查了qt文件的cpp,它并没有名称空间,但它有一些自动生成的支持文件,这些文件将类定义到名称空间中,这实际上消除了我的疑问。
class Aclass
{
//body
};
void main()
{
classspace::Aclass b;
}