2012-04-09 2 views
1

Я читал через рамки для игры, и у него есть Doorstruct внутри Roomclass следующим образом:объявляя структура внутри класса

#include <vector> 

class Room{ 
public: 
    struct Door{ 
     unsigned name; 
     unsigned orientation; 
     Room* room1; 
     Room* room2; 
    }; 
    std::vector<Door*> adjacent; 
}; 

Какова цель определения на структуру внутри класс? И имеет ли значение какой модификатор доступа, с которым связана структура?

+0

Это дает вам структуру, общедоступную как Room :: Door, вы также можете иметь класс под названием Car, который также содержит структурную Дверь. –

+0

Меня больше интересует, почему они поддерживают вектор указателей. –

+0

@eds. Я думаю, что причина вектора указателей заключается в том, что каждая дверь уникальна не только для комнаты, но и для мира. – gardian06

ответ

5

В чем заключается цель определения структуры внутри класса?

Это всего лишь вложенный тип.

И имеет ли значение какой модификатор доступа, с которым связана структура?

Если Door был объявлен private затем пытается объявить переменную типа Room::Door вне этого класса выдаст ошибку.

0

Короткий ответ: struct и class означают точно то же самое в C++, для доступа по умолчанию, за исключением. Дверь - всего лишь вложенный класс. Другими словами:

struct Door{ 
    ... 

То же самое, как:

class Door{ 
    public: 
    ... 

Вложенные классы полезна для организации и документирования причин. Это похоже на пространства имен, но предшествует namespace в C++.

1

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

Для очевидного примера большинство типов контейнеров будут определять тип iterator для этого контейнера в виде вложенного класса (или структуры). Несмотря на то, что vector<T>::iterator и deque<T>::iterator представляют собой подобные концепции, каждый из них по-прежнему принадлежит определенному контейнеру и связан с ним.

Что касается спецификаторов доступа, они следуют обычным правилам - если вы сделаете определение структуры/класса private, оно будет видимым только для другого кода того же класса. Если это protected, он будет виден этому классу и его потомкам. Если он будет открыт, он будет виден всем.

Чтобы дать более конкретный пример, для позиции в бизнесе, вы можете иметь:

class secretary {}; 

class executive { 
    class secretary {}; 
}; 

В этом случае ::secretary является «нормальным» секретарь и executive::secretary является исполнительным секретарем - хотя очевидно, аналогичный, исполнительный секретарь, как правило, имеет описание работы, которое по крайней мере несколько отличается от неисполнительного секретаря. Исполнительный вице-президент может иметь одного исполнительного секретаря и двух «нормальных» секретарей, но менеджер более низкого уровня, вероятно, имеет право только иметь нормального секретаря, а не исполнительного секретаря.

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

1

В чем заключается цель определения структуры внутри класса? И имеет ли значение какой модификатор доступа, с которым связана структура?

Никакие два человека не даст вам тот же ответ, как к цели, тем не менее, мы можем сказать вам, что эффекты:

  • В рамках номер вы можете обратиться к классу, как только Дверь.

  • Вне сферы номер вы должны относиться к классу, как номер :: Дверной

  • Да, видимость типа такой же, как любой член класса, и осуществляют частные, защищенные и общественности.

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