现在,我有这个代码,它按预期工作。为了在给定基类型Defense *时设置对象类型Cannon的属性,我正在向它投射Cannon *并使用它来设置属性。
void fillProperties(Defense* defense)
{
if (defense->getType() == "Cannon")
{
Cannon* c = (Cannon*)defense;
double cannonBallDamage, cannonBallSpeed, blastRadius;
cout << "Cannon ball damage (hp): ";
cin >> cannonBallDamage;
cout << "Cannon ball speed (ft/sec): ";
cin >> cannonBallSpeed;
cout << "Blast radius (ft): ";
cin >> blastRadius;
c->setBlastRadius(blastRadius);
c->setCannonBallDamage(cannonBallDamage);
c->setCannonBallSpeed(cannonBallSpeed);
}
}
setBlastRadius
,setCannonBallDamage
和setCannonBallSpeed
方法仅存在于Cannon内,而不存在于防御中。我有6种不同类型的类,它们来自于具有自己额外属性的防御,Cannon是其中之一。
我的问题是:有没有比检查对象类型更简单的方法,并为每个对象创建一个新的(已铸造)指针来设置其属性?
答案 0 :(得分:1)
您可以在Defense
中添加虚拟方法:
class Defense
{
public:
virtual ~Defense()
virtual void fillProperties() = 0;
// [...]
};
class Canon : public Defense
{
public:
virtual void fillProperties() override
{
cout << "Cannon ball damage (hp): ";
cin >> this->cannonBallDamage;
cout << "Cannon ball speed (ft/sec): ";
cin >> this->cannonBallSpeed;
cout << "Blast radius (ft): ";
cin >> this->blastRadius;
}
// [...]
private:
double cannonBallDamage, cannonBallSpeed, blastRadius;
};
Visitor pattern可用于避免在Defense