为什么我不能在外部定义嵌套类?

时间:2011-09-25 18:32:27

标签: c++ mingw external definition nested-class

使用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”用作理论上的单例类。它将代表整个应用程序,并且它的子系统(或“条形”)将在类内部定义和实例化。我这样做是为了让代码更易于管理。如果有人有更可行的设计模式,请告诉我!

2 个答案:

答案 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转换为某种(智能)指针。但这是解决这个问题的唯一方法。