Помогите разобраться с интерфейсом

112
28 августа 2021, 12:10

При попытке скомпилировать проект возникает ошибка

Error C2259 'IMilitaryMan': cannot instantiate abstract class Task12.Tests

#include "pch.h"
#include <stack>
using std::stack;
class IMilitaryMan 
{
public:
    void virtual Serve() = 0;
    virtual ~IMilitaryMan();
};

class Soldier : public IMilitaryMan
{
private:
    int jobCount;
public:
    Soldier() { this->jobCount = 0; }
    void Serve() override { this->jobCount++; }
};

class Officer : public IMilitaryMan
{
private:
    int countSubordinates = 0;
    int jobCountSended = 0;
    stack <IMilitaryMan> Subordinates;
public:
    Officer(IMilitaryMan* Subordinates, int countSubordinates)
    {
        this->countSubordinates = countSubordinates;
        for (size_t i = 0; i < countSubordinates; i++)
            this->Subordinates.push(Subordinates[i]);
    }
    void Serve() override
    {
        stack<IMilitaryMan> serves;
        for (size_t i = 0; i < countSubordinates; i++)
        {
            Subordinates.top().Serve();
            serves.push(Subordinates.top());
            Subordinates.pop();
        }
        Subordinates = serves;
        jobCountSended++;
    }
    ~Officer()
    {
        for (size_t i = 0; i < jobCountSended; i++)
            for (size_t j = 0; j < countSubordinates; j++)
                Subordinates.top().~IMilitaryMan();
    }
};
int main()
{
    Soldier test;
    IMilitaryMan& militaryMan = test;
    militaryMan.Serve();
    return 0;
}
Answer 1

Вы же используете

stack <IMilitaryMan> Subordinates;

Понятно, что в стеке вы пытаетесь работать именно с IMilitaryMan.

Переделайте на

stack <IMilitaryMan*> Subordinates;

соответствующим образом изменив весь код.

Кстати, даже если бы у вас все сработало - вы би имели неприятности со срезкой.

И еще - вот зачем у вас это?

Subordinates.top().~IMilitaryMan();

При вашем варианте - хранить не указатели, а объекты - оно явно излишнее.

READ ALSO
Как изменить цвет конкретного текста для вывода в консоль а не всей консоли?

Как изменить цвет конкретного текста для вывода в консоль а не всей консоли?

Я хочу отдельный вывод в программе выделить с помощью цветовНо при использовании таких вариантов как например:

171
оповещение о подключении к сети

оповещение о подключении к сети

Есть ли в линукс какое нибудь оповещение, когда подключаешься к сети? Это для программированияЯ хочу отслеживать интерфейс например, но не знаю...

117
собрать данные из DIV в JSON

собрать данные из DIV в JSON

Есть динамически сформированная корзина заказа (условно):

184
Как можно уменьшить время алгоритма?

Как можно уменьшить время алгоритма?

Считываю текстовый файл, обрабатываю его и записываю в другой файлНо работает это медленно

310