我想编写一个用于线性程序求解的库。因此,使用了诸如cplex或gurobi的几种求解器。我已经为它们每个提供了一个接口(interface)(都包含将它们包装到求解器特定代码的相同功能)。
现在我想有一个可以实例化的类'LinearProgram'。由LinearProgram(“cplex”)调用,然后调用cplex求解器。
我的第一个想法是使用父类(super class)“solver”,它是所有求解器接口(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/