我是C语言的新手,我常常发现自己想根据一些外部输入(例如命令行输入或从文本文件读取)来声明变量类型。
例如
int main(int argc, char *argv[]) {
if (argv[1] == "thing1") {
Thing1 thing;
} else if (argv[1] == "thing2") {
Thing2 thing;
}
// More code
}
这不起作用,因为我不能在if块之外使用可变的东西,所以我的问题是如何实现此功能?
答案 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)
由于Thing1
和Thing2
是不同的类,因此您需要使用不同类型的thing
变量。最好的选择是将“更多代码”移入函数中,并从您的代码块内部为Thing1
或Thing2
调用这些函数。
答案 2 :(得分:0)
类似于Java反映:
for item in node_PS_if_list['IF_PSE2']:
for item1 in item: