我在if
语句中声明了一个对象,我需要在另一个if
语句中访问它。该对象接受6个整数和1个float作为其参数。
if(mode == 1){
Enemy ene(10 + enLi, 10 + enLi, 0, 0, enL, 1, 0.8);
Enemy dashF(40, 40, 10, 10, 11, 1, 1.6); //I need to use these 2 objects...
}else if(mode == 2){
Enemy ene(18 + enLi, 18 + enLi, 0, 0, enL, 1, 1);
Enemy dashF(52, 52, 10, 10, 12, 3, 2);
}else if(mode == 3){
Enemy ene(24 + enLi, 24 + enLi, 0, 0, enL, 1, 1.2);
Enemy dashF(65, 65, 10, 10, 13, 3, 2.3);
}else if(mode == 4){
Enemy ene(28 + enLi, 28 + enLi, 0, 0, enL, 1, 1.4);
Enemy dashF(80, 80, 10, 10, 14, 4, 2.8);
}
if(en == 1){
battle(ene, "Wolf", false); // down here.
start = false;
koltForest();
return;
}else if(en == 2){
battle(ene, "Bear", false);
start = false;
koltForest();
return;
}else if(en == 4){
battle(dashF, "Dashing Falcon", true);
return;
}else{
battle(ene, "Forest Rat", false);
start = false;
koltForest();
return;
}
答案 0 :(得分:3)
在前几个条件中,将数字存储在变量中,而不是从数字中构建的Enemy
个对象。
然后在条件之外的那些变量中构造Enemy
个对象。
int x;
switch (a) {
case 0: x = 42; break;
case 1: x = 98; break;
case 2: x = 115; break;
// ...
default: throw std::runtime_error("Unexpected value for `a`");
}
Type obj(x);
// Now use `obj`
答案 1 :(得分:2)
您可以在if
之前声明对象,假设它具有默认构造函数,然后在定义有效赋值运算符时覆盖每个分支中的值。
Enemy ene;
if (mode == 1) {
ene = Enemy( /* ... */ );
}
这假设构造和副本分配很便宜。
如果不是这种情况,或者您不想定义默认构造函数,那么您需要使用指针或智能指针(如std::unique_ptr
)来保存对象。
std::unique_ptr<Enemy> ene;
if (mode == 1) {
ene.reset(new Enemy( /* ... */ ));
}
更好的方法是根本不使用if
,而是以一种使用多态的方式编写对象。
代码如:
if (mode == 1) {
// ...
} else if (mode == 2) {
// ...
}
只是为重构而尖叫。至少mode
应该是某种enum
并使用符号名称。如果您使mode
成为自定义类,则它可以使用getEnemy
方法返回具有正确构造函数参数的对象。