如何在C ++中重新定义类对象

时间:2015-05-05 01:16:19

标签: c++ variables

我在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;
        }

2 个答案:

答案 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方法返回具有正确构造函数参数的对象。