fork download
  1. #include <iostream>
  2. using namespace std;
  3. enum Position {GOALTENDER, DEFENCEMEN, FORWARD} ;
  4. typedef unsigned short int USHORT;
  5. const int DEFAULT_PLAYERS_COUNT = 6;
  6. class Player
  7.  
  8. {public:
  9. // это приватные атрибуты класса, доступ к которым есть только изнутри класса
  10. string itsName;
  11. USHORT itsHeight;
  12. USHORT itsWeight;
  13. USHORT itsStamina;
  14. Position itsPosition;
  15.  
  16.  
  17. // все, что после public - общедоступно в коде снаружи
  18. Player(); // конструктор по умолчанию
  19. Player(string name, USHORT height, USHORT weight, USHORT stamina); // конструктор с параметрами
  20. Player* setPosition(Position);
  21. Position getPosition(); // метод класса для получения позиции текущего игрока
  22. void printInfo(); // метод класса для вывода инфо об игроке
  23. };
  24.  
  25.  
  26. Player::Player()
  27. {
  28. itsName = "Стандартный игрок 1";
  29. itsHeight = 150; // к члену текущего создаваемого экземпляра класса можно обратиться так (коротко)
  30. this->itsWeight = 70; // а можно "официальнее" через указатель на текущий экземпляр класса
  31. itsStamina = 5;
  32. }
  33. Player::Player(string name, USHORT height, USHORT weight, USHORT stamina) :
  34. itsName(name), itsHeight(height), itsWeight(weight), itsStamina(stamina)
  35. {
  36. // намеренно оставлено пустым, потому как можно в конструкторах члены класса определять способом выше
  37. // субъективно, читать такой код тяжелее
  38. }
  39. Position Player::getPosition()
  40. {
  41. return itsPosition;
  42. }
  43.  
  44. void Player::printInfo()
  45. {
  46. cout << "Player *" << itsName << "* (height: " << itsHeight << ", weight:" << itsWeight
  47. << ", stamina:" << itsStamina << ")" << endl << endl;
  48. }
  49.  
  50. Player* Player::setPosition(Position newPosition)
  51. {
  52. this->itsPosition = newPosition;
  53.  
  54. return this;
  55. }
  56.  
  57. class Team {
  58. public:
  59. Player* itsPlayers = new Player[DEFAULT_PLAYERS_COUNT];
  60. Team(); // конструктор по умолчанию
  61. ~Team(); // деструктор
  62.  
  63. /**
  64.   * Выводит список игроков текущей команды с указанной позицией
  65.   *
  66.   * Бывает, что реализацию методов вставляют в объявление класса. Технически, так можно, но читать такое тяжело
  67.   * и лучше подобное не делать!
  68.   */
  69. void printTeamByPosition(Position position)
  70. {
  71. for (int i = 0; i < DEFAULT_PLAYERS_COUNT; ++i) {
  72. std::cout <<i<<" "<<itsPlayers[i].getPosition()<<" "<<itsPlayers[i].itsHeight<<"\n";
  73.  
  74. if (itsPlayers[i].getPosition() != position) {
  75. continue;
  76. }
  77.  
  78. itsPlayers[i].printInfo();
  79. }
  80. std::cout <<"\n\n";
  81. }
  82.  
  83.  
  84. };
  85.  
  86.  
  87. Team::Team()
  88. {
  89. itsPlayers[0] = *(new Player());
  90.  
  91. Player* player = new Player("Войнов", 190, 100, 10);
  92. player->setPosition(Position::DEFENCEMEN);
  93. itsPlayers[1] = *player;
  94.  
  95. player = new Player("Малкин", 170, 85, 7);
  96. player->setPosition(Position::FORWARD);
  97. itsPlayers[2] = *player;
  98.  
  99. player = new Player("Бобровский", 183, 93, 6);
  100. player->setPosition(Position::GOALTENDER);
  101. itsPlayers[3] = *player;
  102.  
  103. }
  104.  
  105.  
  106.  
  107. int main() {
  108. Team* redWings = new Team();
  109. Team* blueStars = new Team();
  110.  
  111. redWings->printTeamByPosition(Position::GOALTENDER);
  112. blueStars->printTeamByPosition(Position::DEFENCEMEN);
  113. return 0;
  114. }
Success #stdin #stdout 0s 4400KB
stdin
Standard input is empty
stdout
0 0 150
Player *Стандартный игрок 1* (height: 150, weight:70, stamina:5)

1 1 190
2 2 170
3 0 183
Player *Бобровский* (height: 183, weight:93, stamina:6)

4 0 150
Player *Стандартный игрок 1* (height: 150, weight:70, stamina:5)

5 0 150
Player *Стандартный игрок 1* (height: 150, weight:70, stamina:5)



0 0 150
1 1 190
Player *Войнов* (height: 190, weight:100, stamina:10)

2 2 170
3 0 183
4 0 150
5 0 150