我如何从工厂方法 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_ptr
的pointer 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>();
等等
我有几个 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_ptr
的pointer 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>();
等等