在编译时创建具有不同功能的相同类的对象

时间:2014-07-29 22:28:07

标签: c++

atm我试图找到创建具有共同属性但在一个特定功能上有所不同的对象(类)的最佳解决方案。 我不使用简单子类的原因是,我有大约50个"不同的"对象,我不想为每个对象创建一个类。

我试图这样做:

class module{
public:
  //..constructor and stuff
  void (*work)();
}

int main(){
  module A = new module();
  A->work = [](mainclass* m_class) -> void {/*do smth specific */});
  //... continue with B,C,...
}

我想知道这是否是最优雅(或最可怕)的方式,或者是否有更好的概念来完成这类任务。

2 个答案:

答案 0 :(得分:5)

如果班级 完全相同,请使用模板

template<void(*work_fn)(mainclass*)>
class module{
public:
  //..constructor and stuff
  void work(mainclass* p) {work_fn(p);}
};

void work_A(mainclass*) {/*do smth specific */};

int main(){
  module<work_A> A; //note, no new
  A.work(thingy);
}

如果你必须使用完全相同的类型(有时),那么你可以在你的班级上使用动态调度:

class module {
public:
  //..constructor and stuff
  virtual void work(mainclass* p);
};
template<void(*work_fn)(mainclass*)>
class module_impl : public module {
public:
  using module;
  void work(mainclass* p) {work_fn(p);}
};

void work_A(mainclass*) {/*do smth specific */};

int main(){
  std::unique_ptr<module> A(new module_impl<work_A>(););
  A->work(thingy);
}

然而,这可能是矫枉过正的。如果他们被存储在容器或其他任何东西中,你的想法可能确实是最好的。

class module{
public:
  //..constructor and stuff
  explicit module(std::function<void(mainclass*)> workfunc) : work(std::move(workfunc)) {}

  std::function<void(mainclass*)> work;
};

int main(){
  module A([](mainclass* m_class) -> void {/*do smth specific */}); //note no new
  A.work(thingy);
}

答案 1 :(得分:0)

有一种着名的软件设计模式称为“策略模式”,这可能是您想要的:在运行时更改行为。一个很好的教程(虽然对于java,但可以立即翻译为C++)在这里https://www.youtube.com/watch?v=-NCgRD9-C6o&list=PLF206E906175C7E07&index=3