使用MinGW C ++,我无法将涉及嵌套类的对象模型放在一起。这是一个暴露我的问题的例子:
foo.h中:
/*
* foo.h
*
* Created on: Sep 25, 2011
* Author: AutoBot
*/
#ifndef FOO_H_
#define FOO_H_
class Foo
{
public:
class Bar;
Bar bar;
} extern foo;
#endif /* FOO_H_ */
bar.h:
/*
* bar.h
*
* Created on: Sep 25, 2011
* Author: AutoBot
*/
#ifndef BAR_H_
#define BAR_H_
#include <iostream>
using namespace std;
#include "foo.h"
class Foo::Bar
{
public:
void Test() {cout <<"Test!";}
};
#endif /* BAR_H_ */
main.cpp中:
/*
* main.cpp
*
* Created on: Sep 25, 2011
* Author: AutoBot
*/
#include "foo.h"
Foo foo;
int main (int argc, char *argv[])
{
foo.bar.Test();
return 0;
}
Eclipse CDT构建日志:
**** Build of configuration Debug for project NestedClassTest ****
**** Internal Builder is used for build ****
g++ -O0 -g3 -Wall -c -fmessage-length=0 -o src\main.o ..\src\main.cpp
In file included from ..\src\main.cpp:10:0:
..\src\/foo.h:15:6: error: field 'bar' has incomplete type
..\src\main.cpp: In function 'int main(int, char**)':
..\src\main.cpp:16:6: error: 'class Foo' has no member named 'bar'
Build error occurred, build is stopped
Time consumed: 171 ms.
所以基本上它没有认识到我在bar.h中制作的bar的定义。这是正常的吗?为什么我不能这样定义嵌套类?这仅仅是MinGW工具链的限制吗?任何帮助/建议表示赞赏。
旁注:在我的实际程序中,我打算将它的“foo”用作理论上的单例类。它将代表整个应用程序,并且它的子系统(或“条形”)将在类内部定义和实例化。我这样做是为了让代码更易于管理。如果有人有更可行的设计模式,请告诉我!
答案 0 :(得分:2)
你遇到的一个问题是:当你这样做时:
class Foo
{
public:
class Bar;
Bar bar;
} extern foo;
Bar bar
是非法的,因为您正在尝试使用提供不完整类型的class bar;
。
您也不包括Bar.h
答案 1 :(得分:2)
问题在于:
class Foo
{
public:
class Bar;
Bar bar;
};
此时Foo::Bar
是一个不完整的类型。并且您不能声明不完整类型的变量。这与尝试这样做没有什么不同:
class Foo;
Foo foo;
出于同样的原因,他们都不被允许。
您可以将bar
转换为某种(智能)指针。但这是解决这个问题的唯一方法。