У меня есть заголовок 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. Есть ли в таком дизайне принципиальный недостаток?

1
Travis Liew 20 Май 2014 в 07:28

3 ответа

Лучший ответ

Короткий ответ

Используйте указатель.

private:
Room* north;
...

Длинный ответ

Компилятору C ++ необходимо знать размер класса. Error: incomplete type is not allowed, потому что не может вычислить размер.

Используйте указатель. Поскольку компилятор может вычислить размер pointer.

PS: я не очень хорошо говорю по-английски

6
ohyecloudy 20 Май 2014 в 03:53

Да, у конструкции фатально изъяны. Вы говорите, что в каждой комнате есть еще четыре комнаты. Тогда в каждой из них будет еще четыре комнаты - и каждая из этих еще четырех комнат, и так до бесконечности. Короче говоря, то, что начиналось как одноместная комната, содержит бесконечное количество других комнат.

Вы можете создать комнату, содержащую указатели на четыре другие комнаты. Затем вы можете создать комнаты для тех, к которым можно подключиться, но (что важно), когда вы дойдете до конца цепочки, вы можете создать комнату с нулевыми указателями в направлениях, где больше нет комнат.

7
Jerry Coffin 20 Май 2014 в 03:35

Вы используете тип Room до его полного определения (из определения компилятор выводит size, который требуется для создания объекта), и, поскольку это включение того же типа , будет привести к бесконечному определению. Вы можете добавить указатель или ссылку на Room вместо объекта.

class Room
{
  public:
    Room();

  private:
   Room* north;
   Room* south;
   Room* east; 
   Room* west;
};
1
Lightness Races in Orbit 22 Май 2014 в 17:14