我正在制作一个解决许多类似问题的程序。
我从一个类似于(例如)的类开始:
class problem {
void init();
void solve();
int print_result();
}
但是我想将这个课程扩展到不同的问题:
class problem_A : problem {
void init();
void solve();
void print_result();
}
class problem_B : problem {
void init();
void solve();
void print_result();
}
...
但是在主界面中我想为一个问题(A,B,......)设置一个对象并处理它们:
obj.init();
obj.solve();
obj.print_result();
我如何实现这一目标?应该是什么类型的?
答案 0 :(得分:2)
如果您总是想要init()
然后solve()
然后print_result()
,最好将其包含在(对于C ++)笨拙命名的模板方法模式中:
class problem {
public:
virtual ~problem() = default;
void run() {
init();
solve();
print_result();
}
protected:
virtual void init() = 0;
virtual void solve() = 0;
virtual void print_result() = 0;
};
然后,每个明确的问题都必须为这些函数提供实现:
class problem_A : public problem {
protected:
void init() override { .. }
void solve() override { .. }
void print_result() override { .. }
};
problem* p = new problem_A(..);
p->run(); // inits, solves, and prints the results for problem A
答案 1 :(得分:1)
您坚持使用原始课程,但要将方法设为纯virtual
class problem {
virtual void init() = 0;
virtual void solve() = 0;
virtual int print_result() = 0;
}
然后你可以override
派生类中的这些函数
class problem_A : problem {
virtual void init() override;
virtual void solve() override;
virtual void print_result() override;
}
然后你可以按如下方式制作你的对象:
problem* obj = new problem_A;
obj->init();
obj->solve();
obj->print_result();
这将调用problem_A
的方法,但您可以使用指向基类problem
的指针。显然要确保你清理内存
delete obj;
或使用智能指针
std::unique_ptr<problem> = std::unique_ptr<problem>(new problem_A);