2010-10-23 3 views
3

Это, наверное, немой вопрос. Я пытаюсь сделать текст-грязь. Мне нужно, чтобы каждый класс комнаты содержал другие классы комнат, на которые можно ссылаться при попытке перейти к ним или получить от них информацию. Однако я не могу этого сделать, потому что я, очевидно, не могу объявить класс в своем определении. Итак, как мне это сделать? Вот что я имею в виду, когда я заявляю, что я не могу это сделать:Переменная класса в пределах ее определения?

class Room { 
    public: 
     Room NorthRoom; 
     Room EastRoom; 
     Room SouthRoom; 
     Room WestRoom; 
}; 
+0

Спасибо за ответы. Я забыл о указателях. Это новое понятие для меня, избалованное роскошной лень языков высокого уровня. – Reznor

+2

Если вы новичок в C++, вы можете получить [хорошую вступительную книгу] (http://stackoverflow.com/questions/388242/the-definitive-c++-book-guide-and-list), даже если вы имеют опыт работы с другими языками. В дополнение к приведенным ниже ответам взгляните на «умные указатели» (вы можете искать здесь в Stack Overflow или в Google), что упрощает управление памятью на C++ _far_. –

ответ

5

Это не возможно иметь переменную с Room члена. Вы могли бы использовать указатель или ссылку.

class Room { 
    public: 
     Room* NorthRoom; 
     Room* EastRoom; 
     Room* SouthRoom; 
     Room* WestRoom; 
}; 
+4

Это более фундаментально, чем класс, который не является полным. Если бы это было возможно, результирующий класс был бы бесконечного размера! –

+0

@Oli: Да. Я удалил это сразу после отправки сообщения, поскольку я понял, что это не причина. – kennytm

1

Ваши Room потребности иметь указатели других Room с (то есть, Room* s).

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

Если класс может содержать переменные член своего собственного типа, то его размера будет бесконечным (каждый Room содержит четыре других Room с, каждый из которых содержит четыре других Room с, каждый из которых содержит. ..)

C++ не имеет объектов ссылочного типа, таких как Java и C#.

2

Уверен, что в КАЖДОЙ комнате нет четырех детских комнат, не так ли? В противном случае число ваших номеров есть бесконечность, которую трудно обрабатывать в конечной памяти :-)

Вы можете попробовать

class Room { 
    public: 
     Room* NorthRoom; 
     Room* EastRoom; 
     Room* SouthRoom; 
     Room* WestRoom; 
}; 

Тогда вы можете иметь NULL указатели, когда помещение не имеет детей.

0

Вы должны использовать указатели:

class Room { 
    public: 
     Room* NorthRoom; 
     Room* EastRoom; 
     Room* SouthRoom; 
     Room* WestRoom; 
}; 

Вероятно, причиной является то, что класс еще не его конструктора, поэтому при использовании указателей вы инициализировать их позже, когда класс имеет construcotr определения.

Смежные вопросы