2012-11-08 6 views
1

Это относительно простой вопрос, но особенности меня смущают.Использование Custom Struct внутри определения класса

У меня есть основная-структура следующим образом:

struct player { 
    string name; 
    int rating; 
}; 

и класс «команду», которая сделает использование этой структуры. Имея это в виду, где правильное размещение структуры «игрока» внутри публичных/частных полей команды или в отдельном файле? Кроме того, будет ли что-то другое, что мне нужно сделать, чтобы создать экземпляр? Благодарю.

+0

Мне интересно, если 'struct player {int rating; имя строки; }; 'лучше выравнивается ... – SingerOfTheFall

+0

@SingerOfTheFall Единственное различие заключается в том, где было добавлено дополнение. Существует аргумент для размещения меньших элементов 'struct' в конце, но он никогда не изменит ничего с менее чем тремя элементами и будет аргументировать исходный макет. И даже если это что-то изменит, разница обычно незначительна и может быть проигнорирована. –

+0

@James, thanks, that bugging me for a long time: P – SingerOfTheFall

ответ

1

Это зависит от того, как вы используете структуру team/player. Если игрок используется другой частью приложения, вы должны установить независимость от игрока, это в большинстве случаев.

struct Player { 
    int rating; 
    std::string name; 
}; 

class Team 
{ 

private: 
    std::vector<Player> players_; // here you have a bunch of players 
}; 

если ваш Player полностью внутренне используется Team и никто не использует его, вы можете поместить его внутри Team структуры/класса, чтобы сузить свое имя области.

class Team 
{ 
private: 
    struct Player{ 
     int rating; 
     std::string name; 
    }; 

private: 
    std::vector<Player> players_; // here you have a bunch of players 
}; 
+0

быстрый вопрос: Каковы основные отличия (если они существуют) в использовании между двумя примерами? Я использую структуру игрока для описания данных, считываемых из файла (который позже будет добавлен как часть класса команды) - он используется независимо, но всегда в контексте команды ... –

+0

в первом примере, другой класс может инициализировать объекты Player и использовать их, но во втором примере Player находится в закрытом поле Team, никакие другие классы не могут создавать объекты Player. – billz

0

Просто определите структуру перед классом. , который должен сделать трюк ...

+0

Можете ли вы изменить код и изменить его в своем ответе? –

3

Вы должны задать себе вопрос. Является ли конструкция player бессмысленной, если в сочетании с классом team? Если это так, то, вероятно, он должен быть определен внутри team; в противном случае он должен быть определен независимо.

То есть: если кто-то может захотеть использовать объект player, который не был непосредственно извлечен из team, вы должны сделать player независимой структурой. Поскольку мы не знаем общей структуры или идеи вашей программы, мы не можем дать вам прямой ответ.

0

Я думаю, что команды представляет собой набор игроков, поэтому удобно использовать некоторый контейнер для управления командой.
Много эффективных контейнеров можно найти в STL, это зависит от вас, чтобы выбрать тот, который вам подходит лучше всего.
Также, чтобы сгруппировать персонал, связанный с одной и той же задачей, вы можете использовать namespace.

+0

Я думаю, что оба являются объектами сущности, с их собственными тождествами, поэтому они, вероятно, должны быть непокрытыми, а сдерживание должно быть указателями. –

+0

Согласен, указатели могут обеспечить полиморфизм, если программист решает использовать наследование и виртуальные функции. –

0

Ключ в том, можно ли использовать Player без использования Team. Если это так, это должен быть отдельный класс, а не вложенный. В хорошо разработанном обычном (OO) программном обеспечении большинство вложенных классов используются исключительно внутри внешнего класса и являются частными. Или они - прокси, используемые для возвращаемых значений из функций внешнего класса, но никогда не объявляемые клиентами внешних классов.

Также может считаться целесообразным делать другие «представления» классов классов; например итераторы в контейнер. Являются ли итераторы членами или свободными классами, скорее проблема стиля, чем что-либо другое (но вы должны быть последовательными); это в основном влияет на имя (ContainerIterator против Container::Iterator).

Наконец, шаблоны вводят другое измерение: с учетом шаблона на тип T, в этом шаблоне легко ссылаться на элементы, включая типы членов, T; невозможно найти «несвязанные» типы.Другими словами, если вы создаете шаблон с помощью T == Container, Container::Iterator легко доступен как typename T:Iterator, но у вас нет способа найти ContainerIterator.

Учитывая имена ваших классов, я подозреваю очень сильно, что они должны быть независимыми, с Team, имеющими отношение защиты 1-n к Player. (Я также подозреваю, что оба являются объектами-объектами и должны быть недоступными и непримиримыми. Но это еще одна проблема.)

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