相互递归的类

Posted

技术标签:

【中文标题】相互递归的类【英文标题】: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_ */

【问题讨论】:

您对->运算符有异议吗? 其实我有。我的方式对我来说更简单。 【参考方案1】:
    前向声明类(您可以只前向声明其中一个类,但为了更好的形式,两者都做)。 前向声明方法(同上)。
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 声明之后,因为您不能仅使用前向声明中的方法。

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

【讨论】:

以上是关于相互递归的类的主要内容,如果未能解决你的问题,请参考以下文章

相互递归

相互递归高阶

如何有效地分析相互递归函数

C++ 相互递归变体类型

Hindley Milner类型推断相互递归函数

递归实现驼峰下划线相互转换,支持多层嵌套对象