LINUX.ORG.RU

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

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

Нашёл пример с Factory Method, который ближе к практике:

#include <iostream>
#include <vector>
  
enum Warrior_ID { Infantryman_ID=0, Archer_ID, Horseman_ID };
  
// Иерархия классов игровых персонажей
class Warrior
{
  public:
    virtual void info() = 0;     
    virtual ~Warrior() {}
    // Параметризированный статический фабричный метод
    static Warrior* createWarrior( Warrior_ID id );
};
  
class Infantryman: public Warrior
{
  public:
    void info() { 
      cout << "Infantryman" << endl; 
    }
};
  
class Archer: public Warrior
{
  public:
    void info() { 
      cout << "Archer" << endl; 
    }
};
  
class Horseman: public Warrior
{
  public:    
    void info() { 
      cout << "Horseman" << endl; 
    } 
};
  
  
// Реализация параметризированного фабричного метода
Warrior* Warrior::createWarrior( Warrior_ID id )
{
    Warrior * p;
    switch (id)
    {
        case Infantryman_ID:
            p = new Infantryman();           
            break;      
        case Archer_ID:
            p = new Archer();           
            break;
        case Horseman_ID:
            p = new Horseman();           
            break;              
        default:
            assert( false);
    }
    return p;
};
  
  
// Создание объектов при помощи параметризированного фабричного метода
int main()
{    
    vector<Warrior*> v;
    v.push_back( Warrior::createWarrior( Infantryman_ID));
    v.push_back( Warrior::createWarrior( Archer_ID));
    v.push_back( Warrior::createWarrior( Horseman_ID));
  
    for(int i=0; i<v.size(); i++)
        v[i]->info();
    // ...

Метод createWarrior возвращает ссылку на объект в куче. Можно как-то изменить пример, чтобы объекты создавались в стеке?

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

Нашёл пример с Factory Method, который ближе к практике:

#include <iostream>
#include <vector>
  
enum Warrior_ID { Infantryman_ID=0, Archer_ID, Horseman_ID };
  
// Иерархия классов игровых персонажей
class Warrior
{
  public:
    virtual void info() = 0;     
    virtual ~Warrior() {}
    // Параметризированный статический фабричный метод
    static Warrior* createWarrior( Warrior_ID id );
};
  
class Infantryman: public Warrior
{
  public:
    void info() { 
      cout << "Infantryman" << endl; 
    }
};
  
class Archer: public Warrior
{
  public:
    void info() { 
      cout << "Archer" << endl; 
    }
};
  
class Horseman: public Warrior
{
  public:    
    void info() { 
      cout << "Horseman" << endl; 
    } 
};
  
  
// Реализация параметризированного фабричного метода
Warrior* Warrior::createWarrior( Warrior_ID id )
{
    Warrior * p;
    switch (id)
    {
        case Infantryman_ID:
            p = new Infantryman();           
            break;      
        case Archer_ID:
            p = new Archer();           
            break;
        case Horseman_ID:
            p = new Horseman();           
            break;              
        default:
            assert( false);
    }
    return p;
};
  
  
// Создание объектов при помощи параметризированного фабричного метода
int main()
{    
    vector<Warrior*> v;
    v.push_back( Warrior::createWarrior( Infantryman_ID));
    v.push_back( Warrior::createWarrior( Archer_ID));
    v.push_back( Warrior::createWarrior( Horseman_ID));
  
    for(int i=0; i<v.size(); i++)
        v[i]->info();
    // ...

Метод createWarrior возвращает ссылку на объект в куче. Можно как-то изменить пример, чтобы объекты создавались в стеке.