是否可以相互递归类
Are mutually recursive classes possible?
我读到了如何使用前向声明来使其工作。
class A
{
public:
B *objB;
void foo(){}
}
class B
{
public:
A *objA;
void foo(){}
}
只是想确认这种设计是否可行?
class A
{
public:
B objB;
void foo(){}
}
class B
{
public:
A objA;
void foo(){}
}
PS:如果有人也可以解释为什么/为什么不这样做在逻辑上从类方面实现,而不仅仅是在语言方面,例如引用一些例子。就类而言,这究竟意味着什么?
第二个例子是不可能的。 它说分配给A
的空间包含B
的空间,而又包含A
的空间,等等。 这将需要无限量的内存,并且需要无限的时间来构建。
不,无论是在语言方面还是在类方面都是不可能的。
在类方面:每个A实例都包含一个B实例,该实例包含一个A实例,该实例... =>无限递归。这不是指针版本的问题,因为指针可能不指向有效对象,或者所有 A 指针可能指向同一对象等。
像你的第二个例子这样的相互递归类是不可能的。如果每个实例都有另一个类的相应实例,并且由于没有基本情况来停止递归,则类的大小将是无限的。显然,很难实例化这么大的类。
3.9/5 告诉:
已声明但未定义的类,或者大小未知或元素类型不完整的数组,是未完全定义的对象类型。43 未完全定义的对象类型和 void 类型是不完整的类型 (3.9.1(。对象不应定义为具有不完整的类型。
在第二个示例中,类 A 尝试定义一个类型不完整的成员变量,因此它是格式错误的。
相关文章:
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 如果我们通过引用传递变量,则递归中使用的堆栈空间量是否为零?
- 如何使用递归检查数字是否有重复数字?
- 此递归模板类型定义是否有效C++?
- 我遇到了这个代码片段,不明白. 它递归检查 C++ 字符串中是否存在大写字符
- 如何使用斐波那契和递归函数检查矩形是否是黄金矩形?
- 我的递归可以吗?是否有任何破坏代码的示例?
- 如果我具有调用其其他实例之一的超载函数,它是否被认为是递归功能
- 使用递归模板函数是否会引入函数调用开销,或者编译器是否大部分时间都内联它(下面的示例)?
- 我对变量在递归函数中如何工作的理解是否正确?
- 编写一个函数,用递归函数检查数字是否是正方形
- 我想将这些循环转换为递归.是否可以将这些循环转换为递归
- 是否有可能摆脱模板专用化以停止递归
- 是否有一个术语来表示"single mutex deadlock"(具有非递归互斥锁的死锁类型情况)?
- 是否有一种方法可以使此C 14递归模板在C 17中短
- 是否有对 Clang 递归 ASTVisitor 的最终访问方法
- Constexpr递归函数是否使用If ConstexPR
- 递归是否有限制
- Boost:在异步调用中使用多个递归是否安全