#include <iostream>
using namespace std;
enum Position {GOALTENDER, DEFENCEMEN, FORWARD} ;
typedef unsigned short int USHORT;
const int DEFAULT_PLAYERS_COUNT = 6;
class Player
{public:
// это приватные атрибуты класса, доступ к которым есть только изнутри класса
string itsName;
USHORT itsHeight;
USHORT itsWeight;
USHORT itsStamina;
Position itsPosition;
// все, что после public - общедоступно в коде снаружи
Player(); // конструктор по умолчанию
Player(string name, USHORT height, USHORT weight, USHORT stamina); // конструктор с параметрами
Player* setPosition(Position);
Position getPosition(); // метод класса для получения позиции текущего игрока
void printInfo(); // метод класса для вывода инфо об игроке
};
Player::Player()
{
itsName = "Стандартный игрок 1";
itsHeight = 150; // к члену текущего создаваемого экземпляра класса можно обратиться так (коротко)
this->itsWeight = 70; // а можно "официальнее" через указатель на текущий экземпляр класса
itsStamina = 5;
}
Player::Player(string name, USHORT height, USHORT weight, USHORT stamina) :
itsName(name), itsHeight(height), itsWeight(weight), itsStamina(stamina)
{
// намеренно оставлено пустым, потому как можно в конструкторах члены класса определять способом выше
// субъективно, читать такой код тяжелее
}
Position Player::getPosition()
{
return itsPosition;
}
void Player::printInfo()
{
cout << "Player *" << itsName << "* (height: " << itsHeight << ", weight:" << itsWeight
<< ", stamina:" << itsStamina << ")" << endl << endl;
}
Player* Player::setPosition(Position newPosition)
{
this->itsPosition = newPosition;
return this;
}
class Team {
public:
Player* itsPlayers = new Player[DEFAULT_PLAYERS_COUNT];
Team(); // конструктор по умолчанию
~Team(); // деструктор
/**
* Выводит список игроков текущей команды с указанной позицией
*
* Бывает, что реализацию методов вставляют в объявление класса. Технически, так можно, но читать такое тяжело
* и лучше подобное не делать!
*/
void printTeamByPosition(Position position)
{
for (int i = 0; i < DEFAULT_PLAYERS_COUNT; ++i) {
std::cout <<i<<" "<<itsPlayers[i].getPosition()<<" "<<itsPlayers[i].itsHeight<<"\n";
if (itsPlayers[i].getPosition() != position) {
continue;
}
itsPlayers[i].printInfo();
}
std::cout <<"\n\n";
}
};
Team::Team()
{
itsPlayers[0] = *(new Player());
Player* player = new Player("Войнов", 190, 100, 10);
player->setPosition(Position::DEFENCEMEN);
itsPlayers[1] = *player;
player = new Player("Малкин", 170, 85, 7);
player->setPosition(Position::FORWARD);
itsPlayers[2] = *player;
player = new Player("Бобровский", 183, 93, 6);
player->setPosition(Position::GOALTENDER);
itsPlayers[3] = *player;
}
int main() {
Team* redWings = new Team();
Team* blueStars = new Team();
redWings->printTeamByPosition(Position::GOALTENDER);
blueStars->printTeamByPosition(Position::DEFENCEMEN);
return 0;
}