2017-08-20 12 views
1

私は抽象クラスの戦士から延長されているヒーローといくつかのクラスがあります。ファクトリメソッドからunique_ptrを返すにはどうすればよいですか?

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

class Warrior 
{ 
    public: 
    virtual void info() = 0; 
    virtual ~Warrior() { } 
    static unique_ptr<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; 
    } 
}; 

を、これは特定の文字を返す私のファクトリメソッド、次のとおりです。

私は特定のでunique_ptrを返すことができますどのように
unique_ptr<Warrior> Warrior::createWarrior(Warrior_ID id) 
{ 
    unique_ptr<Warrior> p; 
    switch (id) 
    { 
     case Infantryman_ID: 
      p = new Infantryman(); //this doesn't work 
      break; 
     case Archer_ID: 
      p = new Archer(); //this doesn't work 
      break; 
     case Horseman_ID: 
      p = new Horseman(); //this doesn't work 
      break; 
     default: 
    } 
    return p; 
}; 

make_uniqueを使わずに文字を入力しますか?

答えて

4

std::unique_ptrさんpointer constructorreset()メンバ関数を使用、あなたはまた

p = std::unique_ptr<Warrior>{new Infantryman()}; 

を必要とするので、明示的である:コメントで指摘したように

p.reset(new Infantryman()); 

を、あなたは本当に宣言する必要はありません。ローカル変数pを編集してから変更してください。スイッチブロックから直接戻ることができます:

などです。

+0

または、ローカル変数をすべて取り除く - 'return unique_ptr (new Infantryman());' –

+0

@NeilButterworth確かに。この場合、RVOとそれを思い出すまでは、本当に問題はないと思った。 – juanchopanza

関連する問題