如何从工厂方法返回unique_ptr?

时间:2017-08-20 18:37:28

标签: c++ factory

我有一些英雄课程,这些课程是从抽象类Warrior扩展而来的:

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<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的情况下返回具有特定字符的unique_ptr?

2 个答案:

答案 0 :(得分:5)

std::unique_ptr&#39; pointer constructor是明确的,因此您需要

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

或者,使用reset()成员函数:

p.reset(new Infantryman{});

正如评论中所述,您并不需要声明局部变量p然后进行修改。您可以直接从开关块返回:

    case Infantryman_ID:
        return std::unique_ptr<Warrior>{new Infantryman{}};
    case Archer_ID:
        return std::unique_ptr<Warrior>{new Archer{}};

等等。

答案 1 :(得分:0)

如果您的编码标准允许使用模板,则可以将工厂方法编写为:

template<typename T>
static unique_ptr<Warrior> createWarrior()
{
    return unique_ptr<Warrior> { new T{} };
}

在主叫站点,使用:

unique_ptr<Warrior> archer1 = WarriorFactory::create<Archer>();
unique_ptr<Warrior> horseman1 = WarriorFactory::create<Horseman>();