我想编写一个用于求解线性程序的库。因此使用了几个求解器,例如 cplex 或 gurobi。我已经拥有的是它们每个的接口(interface)(都包含将它们包装到求解器特定代码的相同函数)。
现在我想要一个可以实例化的类“LinearProgram”,例如通过 LinearProgram("cplex") 然后调用 cplex 求解器。
我的第一个想法是使用一个父类(super class)“求解器”,它是所有求解器接口(interface)的基类,包含各自的函数作为虚拟声明。但是后来我得到了一个无法实例化的抽象类。 因此,在 LinearProgram 中,我希望有一个变量 Solver,它根据构造函数中给定的字符串进行实例化。
我确信一个合适的解决方案是显而易见的,但我目前所能想到的一切并不令人满意。
感谢您的帮助。
最佳答案
这说明了您所描述的内容:
class Solver {
...abstract base
};
class SolverFactory {
public:
Solver* NewSolverWithName(const std::string& pSolverName);
};
class LinearProgram {
public:
LinearProgram(const std::string& pSolverName) :
d_solver(SolverFactory::NewSolverWithName(pSolverName)) {
}
private:
some_auto_pointer<Solver> d_solver;
};
class cplex_Solver : public Solver {
...
static std::string Name();
};
Solver* SolverFactory::NewSolverWithName(const std::string& pSolverName) {
if (pSolverName == cplex_Solver::Name()) {
return new cplex_Solver();
}
...
}
关于c++ - 正确的继承/类结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13239350/