C ++ - 创建一个神对象

时间:2014-06-03 02:50:18

标签: c++

我正在努力让自己过去的假设情况。

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.hbar.h中的包含行,似乎我的选项是转发声明class HoldsFooBar;但是我只能访问H,而F和B看不到彼此。同样,我可以#include "HoldsFooBar.h",但由于我的包含警卫,某些内容最终无法正确链接,因此程序无法运行。

我正在尝试做甚么可能吗?非常感谢你!任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

WhozCraig指出->可能,但强烈反对。这是一个god object的实例,一个OOP反模式。

答案 1 :(得分:1)

如果您确实需要从foo访问bar.Quxbar foo.Baz,请将它们作为参数传递给相关函数:

foo.h:
//includes?
class foo{
    void Baz(bar &barInstance);
};


bar.h:
//includes?
class bar{
    void Qux(foo &fooInstance);
};

或者,如果您需要一对"" foobar,这将是依赖的,也许这里的方式实际上是将对象组合成一个?如果这不适合你,也许尝试在构造函数中传递它们?

class foo{
   bar &myBarFriend;
   foo(bar& b):myBarFriend(b){};
};

请注意,您仍然需要在此处使用前向声明。

答案 2 :(得分:0)

虽然我会劝阻这种做法,但对于循环引用,你需要一份前瞻性声明。看看这些答案:C++ - How to call creator class/object