История изменений
Исправление 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 раза короче, а делает то же самое. Но мы же понимаем что в этом коде что-то не то, да? Потому что исходный вариант подразумевает некоторый контекст, который не можем показать из-за краткости.
Вот вы начинаете хитрить, чтобы формально нельзя было сказать, что с кучей работаем. Да, можно, например, сделать глобальный массив байтов и аллокатор к нему и использовать его вместо кучи. Формально будет не куча, конечно. А фактически - получаем почти те же проблемы, что и с кучей.