我正在努力让自己过去的假设情况。
HoldsFooBar.h:
#include "foo.h"
#include "bar.h"
class HoldsFooBar{
foo F;
bar B;
};
foo.h:
//includes?
class foo{
HoldsFooBar *H;
void Baz();
};
bar.h:
//includes?
class bar{
HoldsFooBar *H;
void Qux();
};
我正在努力让F获得B。在我使用的所有其他语言中,我能够H->B.Qux();
,但我完全迷失在C ++中。在foo.h
和bar.h
中的包含行,似乎我的选项是转发声明class HoldsFooBar;
但是我只能访问H,而F和B看不到彼此。同样,我可以#include "HoldsFooBar.h"
,但由于我的包含警卫,某些内容最终无法正确链接,因此程序无法运行。
我正在尝试做甚么可能吗?非常感谢你!任何帮助将不胜感激!
答案 0 :(得分:2)
WhozCraig指出->
可能,但强烈反对。这是一个god object的实例,一个OOP反模式。
答案 1 :(得分:1)
如果您确实需要从foo
访问bar.Qux
和bar
foo.Baz
,请将它们作为参数传递给相关函数:
foo.h:
//includes?
class foo{
void Baz(bar &barInstance);
};
bar.h:
//includes?
class bar{
void Qux(foo &fooInstance);
};
或者,如果您需要一对"" foo
和bar
,这将是依赖的,也许这里的方式实际上是将对象组合成一个?如果这不适合你,也许尝试在构造函数中传递它们?
class foo{
bar &myBarFriend;
foo(bar& b):myBarFriend(b){};
};
请注意,您仍然需要在此处使用前向声明。
答案 2 :(得分:0)
虽然我会劝阻这种做法,但对于循环引用,你需要一份前瞻性声明。看看这些答案:C++ - How to call creator class/object