在c ++中声明if块内的变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在c ++中声明if块内的变量相关的知识,希望对你有一定的参考价值。

我是c ++的新手,我经常发现自己想根据一些外部输入声明变量类型,例如命令行输入或从文本文件中读取。

例如

int main(int argc, char *argv[]) {

   if (argv[1] == "thing1") {
       Thing1 thing;
   } else if (argv[1] == "thing2") {
       Thing2 thing;
   }

// More code
}

这不起作用,因为我不能在if块之外使用变量的东西,所以我的问题是如何实现这个功能?

答案

听起来你正在寻找一些运行时多态性。在C ++中,你无法真正对堆栈对象进行多态化 - 你最接近的就是伪造它,通过在外部范围内声明堆栈上的两个对象,然后只使用其中一个,如下所示:

int main(int argc, char *argv[]) {
   Thing1 thing1;
   Thing2 thing2;
   bool useThing1 = true;

   if (strcmp(argv[1], "thing1") == 0) {
      useThing1 = true;
   } else if (strcmp(argv[1], "thing2") == 0) {
      useThing1 = false;
   }

   if (useThing1)
   {
      thing1.DoSomething();
   }
   else
   {
      thing2.DoSomething();
   }

   [... rest of code ...]
}

...但这并不是很令人满意,如果你需要两种以上的Thing,它将不会很好地扩展。

更好的方法是使用继承和动态分配,如下所示:

class ThingBase
{
public:
   ThingBase() {}
   virtual ~ThingBase() {}

   virtual void DoSomething() = 0;
};

class Thing1 : public ThingBase
{
public:
   Thing1() {}

   virtual void DoSomething() {std::cout << "Thing1::DoSomething() called" << std::endl;}
};

class Thing2 : public ThingBase
{
public:
   Thing2() {}

   virtual void DoSomething() {std::cout << "Thing2::DoSomething() called" << std::endl;}
};

int main(int argc, char *argv[]) {
   ThingBase * thing = NULL;

   if (strcmp(argv[1], "thing1") == 0) {
       thing = new Thing1;
   } else if (strcmp(argv[1], "thing2") == 0) {
       thing = new Thing2;
   }

   if (thing)
   {
      thing->DoSomething();

      [... rest of code ...]

      delete thing;
   }
}

...这种方式更好,因为[... rest of code..]main()部分不必知道(或关心)它正在使用的ThingBase的子类;特别是,它可以在DoSomething()指针上调用thing方法,并自动调用相应的方法实现。这有助于保持调用代码简单(当您开始添加更多类型的Thing时,这变得更加重要)

另一答案

由于Thing1Thing2是不同的类,你需要不同类型的thing变量。最好的选择是将“更多代码”移动到函数中,并从块内部调用Thing1Thing2

另一答案

像java反映:

#include <stdio.h>
#include <stdlib.h>

class Base {
public:
    Base() {
        printf("CalssBase
");
    }
};


class A : public Base {
public: 
    A() {
        printf("CalssA
");
    }
};


class REG_A {
public:
    static Base* newInst() {
        return new A();
    }
};

Base* p;

#define CREATE(name) 
p = REG_##name::newInst();

int main(void) {
    CREATE(A);
    return 0;
}

以上是关于在c ++中声明if块内的变量的主要内容,如果未能解决你的问题,请参考以下文章

现代c++实践:变量声明强化,竟然可以在if/switch中定义变量!

javascript:变量的作用域

作用域

在python程序中,一个源代码文件中,在函数体中声明的变量(包括函数参数)称?

JS变量声明提升

C:作用域