【发布时间】:2016-01-14 20:28:48
【问题描述】:
是否可以将抽象类作为参数传递并使用其成员函数,如下所示? (总结:创建的模型需要从基类派生的求解器,并且要求解的方程组可能会改变)。
#include <iostream>
#include <string>
#include <functional>
class AbstractSolver {
public:
virtual ~AbstractSolver(){}
virtual double solve() = 0;
virtual void setSystem(std::function<double(double,double)> system) = 0;
};
class ConcreteSolver : public AbstractSolver {
protected:
double stepSize;
double initialValue;
std::function<double(double, double)> system;
public:
ConcreteSolver(double stepSize,
double initialValue) :
stepSize(stepSize),
initialValue(initialValue) {}
double solve() {
// implementation here ...
}
void setSystem(std::function<double(double,double)> system) {
this->system = system;
}
};
class Model {
protected:
std::function<double(double,double,double)> system;
AbstractSolver * solver;
public:
Model(AbstractSolver * solver,
std::function<double(double, double, double)> system ) {
this->solver = solver;
this->system = system;
}
~Model() {
delete solver;
}
double getSolution(double tau) {
std::function<double(double, double)> sys =
[this, tau](double t, double y) { return system(t, y, tau); };
solver->setSystem(sys); // SIGSEGV
return solver->solve();
}
};
int main(){
std::function<double(double, double, double)> system =
[](double t, double y, double tau) {
return 0;// return some mathematical expression
};
AbstractSolver * solver = new ConcreteSolver(0, 1);
Model model = Model(solver, system);
model.getSolution(0.1);
}
这将编译,但问题是它在我在上面放置评论的地方出现了错误。谁能解释为什么(我无法找到与此相关的任何信息)?欢迎提出建议
【问题讨论】:
-
learn how to use a debugger 的绝佳机会。
-
您需要关注Rule of Three。由于您缺少复制构造函数/复制分配,因此在创建、复制和销毁临时模型后,它会删除您的求解器。
-
@ead 它是用 C++ 编码的。我在这里只放了相关部分,实际代码更大更复杂,所以我试图抓住本质。我意识到我在那里犯了几个错误......我已经更新了上面的内容:对不起,我有点累了。
-
这段代码显示了最可怕的模式。您在构造函数中接受一个指针,然后在析构函数中删除它。谁给你保证这个指针是可删除的?删除所有糟糕的指针,用
unique_ptrs 替换它们,这些问题就会消失。 -
@EdHeal 这就是为什么它是一个指针
标签: c++ inheritance parameter-passing