我有这种情况(两个类有两个不同的头文件):
#include "a.h"
class B {
friend void B* A::create(void);
private:
int x;
};
#include "b.h"
class A {
public:
void B* create(void);
...
};
基本上A类创建“B”对象。我想给创建函数create()访问权限来修改类B的私有成员'x'。我想在C#中模拟'internal'关键字,但是更细粒度。
我遇到的问题是我最终得到了一个循环标题引用。 b.h想要在a.h之后来,但a.h想要在b.h之后来。这样做的正确方法是什么?我需要求助于void * ptrs吗?由于我只创建一种类型的对象,我认为我不需要工厂模式。希望我错过了一些简单的东西。
答案 0 :(得分:2)
您需要的是“前瞻性声明”。基本上你没有在其他类的标题中包含类的标题(除非你想使用组合,然后你必须)。在你的情况下,它看起来像这样:
// B.h
class A;
class B {
// declare pointers to A freely
};
反过来说A.h。
你可能需要在B.cpp中包含A.h(反之亦然),以便能够实际取消引用那些访问字段的指针,但是你的圆形包含问题现在已经消失了。