我的标题Room.h
定义如下:
#ifndef ROOM_H
#define ROOM_H
class Room
{
public:
Room();
private:
Room north;
Room south;
Room east;
Room west;
};
#endif
但我为每个Error: incomplete type is not allowed
变量得到Room
。这种设计有根本缺陷吗?
答案 0 :(得分:6)
是的,设计存在致命缺陷。你说每个房间还有四个房间。然后,每个房间将包含四个房间 - 以及另外四个房间中的每个房间,等等无限期。简而言之,从单个房间开始,包含无限的其他房间。
您可以创建一个包含指向其他四个房间的指针的房间。然后你可以为那些连接的人创建空间,但是(重要的是)当你到达一个链的末尾时,你可以创建一个房间,在没有房间的方向上有空指针。
答案 1 :(得分:5)
使用指针。
private:
Room* north;
...
C ++编译器需要知道Class的大小。 Error: incomplete type is not allowed
,因为无法计算大小。
使用指针。因为编译器可以计算pointer
的大小。
答案 2 :(得分:1)
在完全定义它之前使用Room
类型(根据定义,编译器推导出创建对象所需的size
),并且因为它是相同的类型包容性,将导致无限的定义。您可以添加指针或引用Room
而不是对象。
class Room
{
public:
Room();
private:
Room* north;
Room* south;
Room* east;
Room* west;
};