Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CPP中的递归定义_C++ - Fatal编程技术网

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;
    };