这是我的问题。
我想在1小时文件中实现2个类
让我们称它们为类Foo和类Bar。我的问题是Bar的函数返回值为Foo,而Foo的函数返回值为Bar。
因此,我如何正确地向前宣布这些,以便他们可以互相玩得很好。
由于
答案 0 :(得分:3)
class Foo;
class Bar{
public:
Foo * getMyFoo();
private:
Foo * mMyFoo;
};
class Foo{
public:
void setMyBar(Bar *);
private:
Bar * mTheBar;
};
答案 1 :(得分:1)
这很容易..
class A; // yay, forward declared A
class B {
private:
A* fPtrA;
public:
void mymethod(const& A) const;
};
更全面的指南:http://www.eventhelix.com/RealtimeMantra/HeaderFileIncludePatterns.htm
其中还展示了如何处理周期性依赖:
/* ====== x.h ====== */
// Forward declaration of Y for cyclic dependency
class Y;
class X
{
Y *m_y;
...
};
/* ====== y.h ====== */
// Forward declaration of X for cyclic dependency
class X;
class Y
{
X *m_x;
...
};
答案 2 :(得分:0)
在这种情况下,您无法按价值返回。您必须通过引用或指针传入函数,并填充该值。
void stuff(Foo *output)
{
//change output;
}
或者您可以返回引用或指针:
Foo * stuff()
{
return &my_foo;
}
答案 3 :(得分:0)
是的,您可以按照两个类中的值返回
标题
class Foo;
class Bar{
public:
Foo getMyFoo();
};
class Foo{
public:
Bar getMyBar();
};
体
Foo Bar::getMyFoo(){
return Foo();
}
Bar Foo::getMyBar(){
return Bar();
}
但是,正如其他人已经指出你不能在每个类中保存其他类型的成员变量(你可以只用1种方式),此时你开始查看指针,可能是shared_ptr和weak_ptr来维护关系,然后你为什么要按价值回报。
答案 4 :(得分:0)
你也可以在另一种类型中声明一种类型 - 考虑到它们的共同依赖性,这通常是一个好主意。
您可以使用模板推迟一个界面的实例化。