【问题标题】:Mutually recursive classes相互递归的类
【发布时间】:2011-03-25 13:10:57
【问题描述】:

如何在 C++ 中实现相互递归的类?比如:

/*
 * Recursion.h
 *
 */

#ifndef RECURSION_H_
#define RECURSION_H_

class Class1
{
  Class2* Class2_ptr;
public:
  void Class1_method()
  {
      //...
      (*Class2_ptr).Class2_method();
      //...
  }
};

class Class2
{
    Class1* Class1_ptr;
public:
    void Class2_method()
    {
        //...
        (*Class1_ptr).Class1_method();
        //...
    };
};


#endif /* RECURSION_H_ */

【问题讨论】:

  • 您对->运算符有异议吗?
  • 其实我有。我的方式对我来说更简单。

标签: c++ class recursion scope mutual-recursion


【解决方案1】:
  1. 前向声明类(您可以只前向声明其中一个类,但为了更好的形式,两者都做)。
  2. 前向声明方法(同上)。
class Class1;
class Class2;

class Class1
{
  Class2* Class2_ptr;
public:
  void Class1_method();
};

class Class2
{
  Class1* Class1_ptr;
public:
  void Class2_method();
};

void Class1::Class1_method()
{
  //...
  (*Class2_ptr).Class2_method();
  //...
}

void Class2::Class2_method()
{
  //...
  (*Class1_ptr).Class1_method();
  //...
}

【讨论】:

  • 您忘记提出前向声明,但这个答案仍然有我最清楚的代码。
  • @drenami:哎呀!抱歉,我的测试代码中有它,但在剪切和粘贴中出错了。我会修复它...
【解决方案2】:

Forward 在顶部声明一个类(或两者),例如:

class Class2;
class Class1 { ... };

并在定义完两个类之后再定义方法(即外联):

class Class1
{
 ...
 void Class1_method(); // just declare
 ...
};

class Class2
{
 ...
};

// once definition of Class2 is known, we can define the method of Class1
void Class1::Class1_method()
{
      //...
      (*Class2_ptr).Class2_method();
      //...
}

【讨论】:

  • 什么意思?不定义方法怎么定义类?
【解决方案3】:

预先声明其中一个类,例如Class2

#ifndef RECURSION_H_
#define RECURSION_H_
class Class2;
class Class1
{
   Class2* Class2_ptr;
   public:
   void Class1_method()
   {
      //...
      (*Class2_ptr).Class2_method();
      //...
   }
};

class Class2
{
     // ...
}  

【讨论】:

    【解决方案4】:

    使用前向声明。

    class Class2;
    
    class Class1
    {
      Class2* Class2_ptr;
    };
    
    class Class2 
    {
      Class1* Class1_ptr;
    }
    

    因为 Class1 中的方法将取决于 Class2 的实际定义,所以方法定义必须出现在 Class2 声明之后,因为您不能仅使用前向声明中的方法。

    另一方面,这种紧密耦合通常表明设计不佳。

    【讨论】:

      猜你喜欢
      • 2012-02-08
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      • 2013-02-03
      相关资源
      最近更新 更多