调用方法时可以设置类实例吗?

时间:2019-05-16 15:43:17

标签: c++ class

如果我有一个类myClass,并且有两个实例,class1class2,但是设置了我想在哪个时间使用哪个实例,能够吗?

例如:

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秒就会发生变化,例如在另一个线程中。

3 个答案:

答案 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,您可以让编译器为您进行所有检查。因此,没有机会在测试条件和要执行的主体之间犯错误。