假设我们有一个A类,它将另一个B类作为一个元素;
//ClasA.h
#ifndef _A_HEADER
#define _A_HEADER
#include "ClassB.h"
class B;
class A
{
private:
B b;
public:
A();
};
#endif
和
//ClassA.cpp
#include "ClassA.h"
A::A(){}
现在,我们希望B类有一个指向A类的指针。所以我们将B类定义为:
//ClassB.h
#ifndef _B_HEADER
#define _B_HEADER
#include "ClassA.h"
class A;
class B
{
private:
A *a;
public:
B();
};
#endif
和
//ClassB.cpp
#include "ClassB.h"
B::B(){}
这样,我们将有一个A类,它将包含一个对象B.而对象B将有一个指向A类的指针。不幸的是,这不起作用。我收到以下错误:
-ClassA.h:9:7:错误:字段'b'的类型不完整。 B b;
我该如何解决这个问题?并且,考虑到我修复它,实现这样的系统是否值得?我的意思是,它肯定不会很优雅。
-
答案 0 :(得分:1)
您必须至少在一个班级使用前瞻声明。
例如:
//ClassB.h
#ifndef _B_HEADER
#define _B_HEADER
class A;
class B
{
private:
A *a;
public:
B();
};
#include "ClassA.h"
#endif
而且,考虑到我修复它,实现一个系统是否值得 像这样?
这种方法通常没有任何问题,有时候也是必要的。
关于您所看到的具体错误:
-ClassA.h:9:7:错误:字段'b'的类型不完整。 B b;
这是因为,在使用前向声明时,您无法声明任何特定于实现的内容。如果您使用B *b;
,则可能会收到评论中引用的问题中提到的错误。