前方申报问题

时间:2010-10-06 19:21:01

标签: c++

这是我的问题。

我想在1小时文件中实现2个类

让我们称它们为类Foo和类Bar。我的问题是Bar的函数返回值为Foo,而Foo的函数返回值为Bar。

因此,我如何正确地向前宣布这些,以便他们可以互相玩得很好。

由于

5 个答案:

答案 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)

你也可以在另一种类型中声明一种类型 - 考虑到它们的共同依赖性,这通常是一个好主意。

您可以使用模板推迟一个界面的实例化。