我想编写一个用于线性程序求解的库。因此,使用了诸如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/

10-11 19:39