我想写一个用于线性程序求解的库。因此,使用了诸如cplex或gurobi的几种解算器。我已经拥有的是每个人的接口(所有接口都包含相同的功能,将它们包装到解算器特定的代码中)。
现在我想要一个可以实例化的类'LinearProgram',例如通过LinearProgram(“cplex”),然后调用cplex求解器。
我的第一个想法是使用超类'求解器',它是所有求解器接口的基类,包含各自的函数作为虚拟声明。但后来我得到了一个无法实例化的抽象类。 所以在LinearProgram中我想要一个变量Solver,它根据构造函数中给出的字符串进行实例化。
我确信一个合适的解决方案是非常明显的,但我现在所能想到的并不令人满意。
感谢您的帮助。
答案 0 :(得分:0)
这说明了你所描述的内容:
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();
}
...
}
答案 1 :(得分:0)
这是两种不同设计模式相结合的工作。
第一个是Envelope Letter模式,第二个是Strategy Pattern。
继续使用您当前拥有的基类,并创建一个派生类,该类只是将调用转发到指向基类的嵌入式指针。派生类现在可以通过值自由传递。
基类还可以包含一个静态成员函数,该函数返回指向基类的指针。此静态成员函数将允许您使用字符串名称来实例化派生类以查找它。这提供了一种在运行时选择算法的便捷方法。
但是那些知道他们想要哪个派生类(哪种策略)的人可以用“&#39; new&#39;并将其填入信封类的实例中。
如果您决定仅使用shared_ptr
代替基类,则可以选择取消信封类。