基本上,我希望能够做到的就是......
说我有这个:
class Enemy
{
public:
Enemy();
virtual ~Enemy();
};
class Ghost: public Enemy
{
};
class Orc: public Enemy
{
};
我希望能够根据一些随机数创建Ghost或Orc。我是否必须获取随机数并创建一个开关/案例来创建我想要的对象,或者有没有办法从基类创建派生类对象?
快速说明:我只是一个爱好编码器而且经验很少。我从书本和YouTube上自学了我所知道的一切;怜悯
答案 0 :(得分:1)
您不能使用基类中的ctor来构建子对象,因为按照定义构造函数只初始化当前类的字段。
您可以在基类中使用静态工厂方法,但由于C++ object slicing工厂方法无法返回Enemy
- 我这样做,您将只获得原始Enemy
从创建的子类对象复制公共字段。一种更自觉的方式是返回一个指向新创建对象的指针,或者更好的智能指针:
class Enemy
{
public:
Enemy();
virtual ~Enemy();
static std::unique_ptr<Enemy> build_enemy() {
// get random number in choice
Enemy * enemy;
switch (choice) {
case 0: enemy = new Ghost(); break;
default: enemy = new Orc(); break;
}
return std::unique_ptr(enemy);
}
};
如果出于任何原因,您可以在交换机中使用函数数组,可以在这里轻松使用它们:
class Enemy
{
public:
Enemy();
virtual ~Enemy();
static unique_ptr<Enemy> build_enemy();
private:
typedef Enemy* (*Builder)();
static Enemy* buildGhost();
static Enemy* buildOrc();
static Builder builder[];
};
class Ghost: public Enemy
{
};
class Orc: public Enemy
{
};
Enemy* Enemy::buildGhost() {
return new Ghost();
}
Enemy* Enemy::buildOrc() {
return new Orc();
}
std::unique_ptr<Enemy> Enemy::build_enemy() {
// get random choice
Enemy *enemy = (builder[choice])();
return std::unique_ptr<enemy>;
}
Enemy::Builder Enemy::builder[] = { Enemy::buildGhost, Enemy::buildOrc };
答案 1 :(得分:0)
你可以做到这两点,你可以创建一个指向基类对象的指针向量
std::vector<std::unique_ptr<Enemy>> v;
然后根据随机数
向其添加派生类对象switch(number)
{
case 1:
v.emplace_back(new Ghost());
break;
case 2:
v.emplace_back(new Orc());
break;
}