LINUX.ORG.RU

История изменений

Исправление Kogrom, (текущая версия) :

На крошечный пример - крошечные проблемы. У большого примера будут большие проблемы. А так можно и без костылей переписать пример с фабричным методом, что он будет короче, понятнее и без указателей и стрелочек:

#include <iostream>
#include <vector>

using namespace std;

enum Warrior_ID { Infantryman_ID=0, Archer_ID, Horseman_ID };

class Warrior
{
    Warrior_ID m_Id;
public:
    Warrior( Warrior_ID id ):m_Id(id){}

    void info()
    {
        switch (m_Id)
        {
        case Infantryman_ID:
            cout << "Infantryman" << endl;
            break;
        case Archer_ID:
            cout << "Archer" << endl;
            break;
        case Horseman_ID:
            cout << "Horseman" << endl;
            break;
        }
    }

};

int main()
{
    vector<Warrior> warriors;
    warriors.emplace_back( Warrior( Infantryman_ID));
    warriors.emplace_back( Warrior( Archer_ID));
    warriors.emplace_back( Warrior( Horseman_ID));

    for(auto warrior: warriors)
        warrior.info();
}

Почти в 2 раза короче, а делает то же самое. Но мы же понимаем что в этом коде что-то не то, да? Потому что исходный вариант подразумевает некоторый контекст, который не можем показать из-за краткости.

Вот вы начинаете хитрить, чтобы формально нельзя было сказать, что с кучей работаем. Да, можно, например, сделать глобальный массив байтов и аллокатор к нему и использовать его вместо кучи. Формально будет не куча, конечно. А фактически - получаем почти те же проблемы, что и с кучей.

Исходная версия Kogrom, :

На крошечный пример - крошечные проблемы. У большого примера будут большие примеры. А так можно и без костылей переписать пример с фабричным методом, что он будет короче, понятнее и без указателей и стрелочек:

#include <iostream>
#include <vector>

using namespace std;

enum Warrior_ID { Infantryman_ID=0, Archer_ID, Horseman_ID };

class Warrior
{
    Warrior_ID m_Id;
public:
    Warrior( Warrior_ID id ):m_Id(id){}

    void info()
    {
        switch (m_Id)
        {
        case Infantryman_ID:
            cout << "Infantryman" << endl;
            break;
        case Archer_ID:
            cout << "Archer" << endl;
            break;
        case Horseman_ID:
            cout << "Horseman" << endl;
            break;
        }
    }

};

int main()
{
    vector<Warrior> warriors;
    warriors.emplace_back( Warrior( Infantryman_ID));
    warriors.emplace_back( Warrior( Archer_ID));
    warriors.emplace_back( Warrior( Horseman_ID));

    for(auto warrior: warriors)
        warrior.info();
}

Почти в 2 раза короче, а делает то же самое. Но мы же понимаем что в этом коде что-то не то, да? Потому что исходный вариант подразумевает некоторый контекст, который не можем показать из-за краткости.

Вот вы начинаете хитрить, чтобы формально нельзя было сказать, что с кучей работаем. Да, можно, например, сделать глобальный массив байтов и аллокатор к нему и использовать его вместо кучи. Формально будет не куча, конечно. А фактически - получаем почти те же проблемы, что и с кучей.