我如何从工厂方法 return unique_ptr ?

How can I return unique_ptr from factory method?

我有几个 classes 英雄是从抽象 class 战士:

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;
    }
};

这是我的工厂方法,return的特定字符:

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 的情况下使用特定字符 return unique_ptr?

std::unique_ptrpointer constructor是明确的,所以你需要

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

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

p.reset(new Infantryman{});

如评论中所述,您实际上不需要声明局部变量 p 然后修改它。您可以 return 直接从开关块:

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

等等。

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

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>();

等等