Переменная класса в его определении? - PullRequest
3 голосов
/ 23 октября 2010

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

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

Ответы [ 4 ]

5 голосов
/ 23 октября 2010

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

class Room {
    public:
        Room* NorthRoom;
        Room* EastRoom;
        Room* SouthRoom;
        Room* WestRoom;
};
2 голосов
/ 23 октября 2010

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

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

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

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

1 голос
/ 23 октября 2010

Ваш Room должен иметь указатели на другие Room с (то есть Room* с).

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

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

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

0 голосов
/ 23 октября 2010

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

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

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

...