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,...
}
我想知道这是否是最优雅(或最可怕)的方式,或者是否有更好的概念来完成这类任务。
答案 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