4

我需要的是创建两个相互使用的类。

例如:

Class A包含类型的对象Class B,并Class B包含类型的对象Class A

但是,当我编译时,会发生这种情况:“错误:ISO C++ 禁止声明没有类型的 'Map'”

我修改了我的类,以保持 Header (.h) 文件分开,但它没有解决。

也许,这是一个基本问题,但我不知道在谷歌上搜索的关键字......

代码:

单元格.h:

Class Cell
{
public:
    Map *map;
}

地图.h:

Class Map
{
public:
    Cell *cell;
}
4

3 回答 3

3

你想要前向声明和指针。

//a.h
class B; //forward declare than a class B, exist somewhere, although it is not completely defined.

class A{
 map<string,B*> mapOfB;
};

//b.h
class A; //forward declare than a class A, exist somewhere, although it is not completely defined.
class B{
 map<string,A*> mapOfA;
}

在您的 .cxx 中,您实际上会包含必要的标头

//a.cxx
#include "b.h"
A::A(){ /* do stuff with mapOfB */ }

//b.cxx
#include "a.h"
B::B(){ /* do stuff with mapOfA */ }
于 2013-06-21T17:24:27.177 回答
2

您的问题是您有递归包含。Cell.h包括Map.h其中包括Cell.h。而不是像这样包含只是向前声明类:

Cell.h

class Map;

class Cell
{
    // ...
}

Map.h

class Cell;

class Map
{
    // ...
}
于 2013-06-21T17:24:14.380 回答
1

如果class A包含 aclass B并且class B还包含 aclass A则否,则不能这样做。

class B; // forward declaration of name only. Compiler does not know how much
         // space a B needs yet.

class A {
    private:
        B b; // fail because we don't know what a B is yet.
};

class B {
    private:
        A a;
};

即使这可行,也没有办法构造任何一个的实例。

B b; // allocates space for a B
     // which needs to allocate space for its A
     // which needs to allocate space for its B
     // which needs to allocate space for its A
     // on and on...

然而,它们可以包含彼此的指针(或引用)。

class B; // forward declaration tells the compiler to expect a B type.

class A {
    private:
        B* b; // only allocates space for a pointer which size is always
              // known regardless of type.

};

class B {
    private:
        A* a;
};
于 2013-06-21T17:35:10.097 回答