相互递归的类
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 声明之后,因为您不能仅使用前向声明中的方法。
另一方面,这种紧密耦合通常表明设计不佳。
【讨论】:
以上是关于相互递归的类的主要内容,如果未能解决你的问题,请参考以下文章