在C ++中的if块中声明变量

时间:2019-04-10 01:39:45

标签: c++ scope

我是C语言的新手,我常常发现自己想根据一些外部输入(例如命令行输入或从文本文件读取)来声明变量类型。

例如

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

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

// More code
}

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

3 个答案:

答案 0 :(得分:4)

听起来像您正在寻求一些运行时多态性。在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..]的{​​{1}}部分不必知道(或关心)它正在使用的main()的哪个子类;特别是,它可以仅在其ThingBase指针上调用DoSomething()方法,并且将自动调用适当的方法实现。这有助于简化调用代码(在您开始添加更多类型的thing时,这一点就变得越来越重要)

答案 1 :(得分:1)

由于Thing1Thing2是不同的类,因此您需要使用不同类型的thing变量。最好的选择是将“更多代码”移入函数中,并从您的代码块内部为Thing1Thing2调用这些函数。

答案 2 :(得分:0)

类似于Java反映:

for item in node_PS_if_list['IF_PSE2']:
    for item1 in item: