1

Тема: Конструктор копіювання

Маю код:

Прихований текст

#include <iostream>
#include <conio.h>

using namespace std;

class Unit
{
protected:
    double health;
    int damage;
public:
    Unit()
    {
        health = 100;
        damage = 30;
    }

    Unit(double health, int damage)
    {
        this->health = health;
        this->damage = damage;
    }

    virtual void Show() = 0;
};

class Marine : public Unit
{
public:

    Marine() : Unit(200, 35)
    {}

    virtual void Show() override
    {
        cout << "\nMarine: \n";
        cout << "\n\thealth: " << health << "\n";
        cout << "\n\tdamage: " << damage << "\n";
    }
};

class MadScientist : public Unit
{
public:

    MadScientist() : Unit(150, 40)
    {}

    virtual void Show() override
    {
        cout << "\nMad scientist: \n";
        cout << "\n\thealth: " << health << "\n";
        cout << "\n\tdamage: " << damage << "\n";
    }
};

class MilitaryDoctor : public Unit
{
public:

    MilitaryDoctor() : Unit()
    {}

    virtual void Show() override
    {
        cout << "\nMilitary doctor: \n";
        cout << "\n\thealth: " << health << "\n";
        cout << "\n\tdamage: " << damage << "\n";
    }
};

class Barrack
{
public:
    virtual Unit* CreateUnit() = 0;
};

class MilitaryBarrack : public Barrack
{

public:
    virtual Unit* CreateUnit() override
    {
        return new Marine;
    }
};

class ScientistBarrack : public Barrack
{
public:
    virtual Unit* CreateUnit() override
    {
        return new MadScientist;
    }
};

class MedicalBarrack : public Barrack
{
public:
    virtual Unit* CreateUnit() override
    {
        return new MilitaryDoctor;
    }
};

void PrintMenu()
{
    cout << "\n\tMenu\n";
    cout << "\n1 - Military barrack\n";
    cout << "\n2 - Scientist barrack\n";
    cout << "\n3 - Medical barrack\n";
    cout << "\nYour choice: ";
}

int main()
{
    Barrack *barrack = NULL;

    enum menu_items{ MILITARY = 1, SCIENTIST, MEDICAL };

    system("cls");
    PrintMenu();
    int user_choice;
    cin >> user_choice;
    switch (user_choice)
    {
    case MILITARY:
        barrack = new MilitaryBarrack;
        break;
    case SCIENTIST:
        barrack = new ScientistBarrack;
        break;
    case MEDICAL:
        barrack = new MedicalBarrack;
        break;
    default:
        cout << "\nWrong choice\n";
    }

    system("cls");
    Unit *unit = barrack->CreateUnit();
    unit->Show();

    return 0;
}

Мені необхідно переробити його згідно завдання:
Відредагувати ієрархію класів Барак: класи повинні викликати конструктор копії
при створенні юнітів та містити об`єкт юніта, як поле класу.

І, власне, сама проблема: я знаю, що таке конструктор копії, але правильно використати його у цій задачі в мене не виходить. Підкажіть де мені прописувати конструктори копії і де мають бути поля типу Unit?
Шось мене стопорить))

Направте, будь ласка.

2

Re: Конструктор копіювання

class Marine 
{
  Unit unit;
public:
  Marine( const Unit& example );

і т.д.
Взагалі це поганий вибір для архітектури (бо піхотинець є бойовою одиницею, а не містить її); але якби це були стратегії поведінки (MarineStrategy) чи відображення (MarineImage), то було б нормально. Тоді можна "відв'язувати" об'єкти від дій і робити MadScientist, який поводить себе як піхота, а виглядає, як медик.

Подякували: pika1989, leofun012

3

Re: Конструктор копіювання

дякую, зрозуміла.