正确的继承/类结构

时间:2012-11-05 19:54:27

标签: c++

我想写一个用于线性程序求解的库。因此,使用了诸如cplex或gurobi的几种解算器。我已经拥有的是每个人的接口(所有接口都包含相同的功能,将它们包装到解算器特定的代码中)。

现在我想要一个可以实例化的类'LinearProgram',例如通过LinearProgram(“cplex”),然后调用cplex求解器。

我的第一个想法是使用超类'求解器',它是所有求解器接口的基类,包含各自的函数作为虚拟声明。但后来我得到了一个无法实例化的抽象类。 所以在LinearProgram中我想要一个变量Solver,它根据构造函数中给出的字符串进行实例化。

我确信一个合适的解决方案是非常明显的,但我现在所能想到的并不令人满意。

感谢您的帮助。

2 个答案:

答案 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代替基类,则可以选择取消信封类。