在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
时,这变得更加重要)
另一答案
由于Thing1
和Thing2
是不同的类,你需要不同类型的thing
变量。最好的选择是将“更多代码”移动到函数中,并从块内部调用Thing1
或Thing2
。
另一答案
像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中定义变量!