CPP中的递归定义

Yon*_*ing 4 c++

我遇到了这样的问题:更新

class A
{
public:
    A(){}
    int i;
    B b;
};

class B
{
public:
    B(){}
    int j;
    A a;
};
Run Code Online (Sandbox Code Playgroud)

当我在一个.h文件中定义它时,它会出错.我认为问题是递归定义.但有人可以帮我解决这个问题吗?

  1. error C2146: syntax error : missing ';' before identifier 'b' c:\users\xingyo\documents\visual studio 2010\projects\cppalgo\recudef\test1.h 9 1 RecuDef

  2. error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\users\xingyo\documents\visual studio 2010\projects\cppalgo\recudef\test1.h 9 1 RecuDef

  3. error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\users\xingyo\documents\visual studio 2010\projects\cppalgo\recudef\test1.h 9 1 RecuDef

Nik*_*sov 11

这在C++中不可能逐字逐句.解释是编译器需要完整的,而不仅仅是前向的类声明才能将它用作另一个类的成员.它只需要一个类对象的大小.

C++(以及C语言)中的解决方法是使用指针引用作为其中一个类的成员.这样你可以使用前向声明如下:

class A; // forward declaration

class B {
    // ...
    A* pa;
};

class A { // full declaration
    // ...
    B b;
};
Run Code Online (Sandbox Code Playgroud)

保持点实例的A实例B(或引用)有效是你的(不是编译器或运行时)的责任.


use*_*421 6

你解决不了。毫无意义。您已将 A 定义为包含包含另一个包含另一个 B 的 B 的 B,其中...您不可能打算这样做。也许您需要使用指针或引用?