如果我有一个类myClass
,并且有两个实例,class1
和class2
,但是设置了我想在哪个时间使用哪个实例,能够吗?
例如:
if (whichClass == 1) {
class1.result();
} else if (whichClass == 2) {
class2.result();
}
这是我可以做到的一种方式,但是我想避免使用if语句,所以我想按照
string whichClass = "class1"; //global
然后在其他地方...
whichClass.result(); //this depends on what whichClass is at any particular time.
whichClass
变量每60秒就会发生变化,例如在另一个线程中。
答案 0 :(得分:5)
您不能使用字符串来执行此操作,但这正是指针可以执行的操作:
myClass *whichClass = &class1;
whichClass->result();
但是,如果您打算从多个线程访问whichClass
,则必须同步对其的访问。您可以通过互斥量保护它,也可以通过使其成为原子来做到这一点。这是后者的示例:
std::atomic<myClass*> whichClass{&class1};
whichClass = &class2;
whichClass.load()->result();
请注意,这仅保护指针本身(即,将其设置在一个线程中并在另一个线程中取消引用是安全的)。它指向的对象没有受到保护(即,在多个线程中通过它调用result
通常是不安全的)。
答案 1 :(得分:1)
使用指针:
myClass *whichObj;
if (whichClass == 1) {
whichObj = &class1;
}
else if (whichClass == 2) {
whichObj = &class2;
}
...
which->result();
如果您真的想摆脱if
,请使用一个数组:
myClass* clsObjs[] = {
&class1,
&class2
...
};
clsObjs[whichClass-1]->result();
答案 2 :(得分:0)
最初的问题没有指定class1和class2是从公共基类派生的。因此,我不同意先前的答案。无需收紧这两个类别,我认为最好让它们尽可能松散地耦合。
我认为更好的方法是使用函数重载:
class class1 {...} ;
class class2 {...} ;
void result(const class1 & c)
{
// do what is needed with class1
}
void result(const class2 & c)
{
// do what is needed with class2
}
int main()
{
class1 c1 ;
class2 c2 ;
result(c1) ;
result(c2) ;
return 0 ;
}
根本没有if
,您可以让编译器为您进行所有检查。因此,没有机会在测试条件和要执行的主体之间犯错误。