c++ - 如何从工厂方法返回 unique_ptr?

标签 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?

最佳答案

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

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

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

p.reset(new Infantryman{});

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

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

等等。

关于c++ - 如何从工厂方法返回 unique_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45785613/

相关文章:

c++ - 我怎么知道变量是否可以直接写入二进制文件?

java - 获取 SQLServerException 的数据访问对象类

c++ - 使用工厂函数创建std::shared_ptr

java - 如何为给定的字符串创建唯一的序列号?

php - 工厂方法和私有(private)变量

c++ - 在只有 const shared_ptr 的 unordered_set 中找到一个 shared_ptr?

c++ - 如何从 C++ 中的 set<int> 中删除所有偶数

c++ - 将 libstdc++ 静态链接是一个好习惯吗?

c++ - 为 std::istringstream 设置内部缓冲区

oop - 我的对象应该负责随机化自己的内容吗?