C++ CPP中的递归定义
我遇到这样的问题:更新C++ CPP中的递归定义,c++,C++,我遇到这样的问题:更新 class A { public: A(){} int i; B b; }; class B { public: B(){} int j; A a; }; 当我在一个.h文件中定义它时,它会给出一个错误。我认为问题在于递归定义。但是有人能帮我解决这个问题吗 错误C2146:语法错误:缺少“;”标识符“b”之前的c:\users\xingyo\documents\visualstudio 2010\projects\cpp
class A
{
public:
A(){}
int i;
B b;
};
class B
{
public:
B(){}
int j;
A a;
};
当我在一个.h文件中定义它时,它会给出一个错误。我认为问题在于递归定义。但是有人能帮我解决这个问题吗
错误C2146:语法错误:缺少“;”标识符“b”之前的c:\users\xingyo\documents\visualstudio 2010\projects\cppalgo\recudef\test1.h 9 1 recudef
错误C4430:缺少类型说明符-假定为int。注意:C++不支持缺省INT:\用户\NoYOY\Debug \VisualStudio 2010 \Base\CPPalG\ReuDef\Test1.H 9 9 ReuDef < /C> < /P>
错误C4430:缺少类型说明符-假定为int。注意:C++不支持缺省INT:\用户\NoYOY\Debug \VisualStudio 2010 \Base\CPPalG\ReuDef\Test1.H 9 9 ReuDef < /C> < /P>
你不能解决它。这毫无意义。您已经定义了一个包含B的A,其中包含另一个A,其中包含另一个B,其中。。。你不可能是有意的。如果是递归问题,可能需要使用指针或引用。声明没有定义的类:
class A;
class B;
class A
{
...
};
class B
{
...
};
请参阅:将代码拆分为4个文件,例如A.h、A.cpp、B.h和B.cpp
// A.h
class B;
class A {
public:
A();
B* b;
};
// A.cpp
#include "A.h"
#include "B.h"
A::A() : b(new B) {
}
// B.h
class A;
class B {
public:
B(A* a_);
A* a;
};
// B.cpp
#include "B.h"
#include "A.h"
B::B(A* a_) : a(a_) {
}
并以这种方式使用它们:
#include "A.h"
#include "B.h"
int main() {
A a;
B b(&a);
// do logics
return 0;
}
这在C++中是不可能的。解释是编译器需要一个类的完整声明,而不仅仅是向前声明,才能将它用作另一个类的成员。它只需要类对象的大小
C++中的解决方法是使用<强>指针< <强> >或>强>引用< /强>作为类之一的成员。这样,您可以按如下方式使用转发声明:
class A; // forward declaration
class B {
// ...
A* pa;
};
class A { // full declaration
// ...
B b;
};
<> P> >您的(编译器或运行时)的责任是保持<代码>实例> <代码> >实例> <代码> b/COD>指向(或引用)有效。< P>您不能在C++中有类似的递归定义。在声明
类A
的对象之前,必须完全定义A
,以便编译器知道sizeof(A)
。B也是一样。不过,您可以使用指针绕过它。您可以声明一个指向class a
对象的指针,只需在稍后的某个点“承诺”定义class a
。这称为远期申报
前向声明也适用于引用。这些不是实例声明,这里根本没有递归。它们不是,但OP的编辑使其如此。这不仅没有意义,而且在物理上是不可能的。如果OP想要编译什么,它将创建一个无限大的数据结构这不仅在物理上是不可能的,在逻辑上也是不可能的。你到底想做什么?您给出的示例包含错误,让我们猜测。你真的想在类
a
中声明一个嵌套类B
。?这不是递归的。此外,如果您遇到错误,请告诉我们该错误是什么。解决错误的第一步是了解错误。很抱歉,我已经更新了questionForward声明,仅适用于指针和引用。@Dima这是不正确的。它们也适用于类、结构和名称空间,可能还适用于联合。@迪玛:他将不得不使用指针或引用,因为两个类或结构相互包含在一起在物理上是不可能的,因为结果将是无限大的。@EJP,您当然可以向前声明类、结构和名称空间。但是您不能声明一个只被正向声明的类或结构的对象,因为编译器还不知道它的大小。你只能声明一个指向前向声明的类或结构的指针或引用。我同意。这和“转发声明只适用于指针和引用”有点不同,不是吗?请表现得得体一点,并说明你为什么投反对票。
class B; // forward declaration
class A
{
B *b;
};
class B
{
A *a;
};