我刚接触C ++。
我有一个名为Main_Alg
的类,它运行(通用)主算法。我有与基类Calc_Type
不同的类,还有两个派生类,分别为类A
和类B
。
创建Main_Alg
时,run
将运行通用算法,并使用A
或B
(在Calc_Type
中为纯虚拟方法)求解)。由用户指定执行哪一个。
实现此目标的最佳方法是什么?
我想到了模板类Main_alg
:
if (parms == "A"){
std::unique_ptr<Main_Alg<A>> main_alg(new Main_alg<A>);
main_alg -> run;
}
else ... // for B or whatever
正在运行:
std::unique_ptr<T> method;
method -> solve;
method -> getsmthg; //method only implemented for base class Calc_type `
这会使事情变得过于复杂吗?这是好习惯吗?此外,任何阅读建议都将受到赞赏
答案 0 :(得分:1)
std::unique_ptr<Main_Alg> main_alg(new Main_alg<A>;
这是不可能的。 Main_alg
可以是类模板,也可以是类。不能两者兼有。 std::unique_ptr
的第一模板参数是模板类型参数;不是模板模板参数。
我认为以下功能模板可能合适:
template<class T>
void run()
{
Main_Alg<T> m;
m.run();
}
并致电:
if (parms == "A"){
run<A>();
else
run<B>();
答案 1 :(得分:1)
如果您不熟悉C ++,请不要编写自己的模板。它们很酷,但是很难掌握,尤其是当您开始使用C ++编写代码时。
您已经编写了有关纯虚拟类的内容。如果有,则不需要模板。
class Calc_Type {
virtual ~Calc_Type() {}
virtual void run() = 0;
};
class A : public Calc_Type {
public:
void run() override {
stuff_to_do();
}
};
class B : public Calc_Type {
public:
void run() override {
other_stuff_to_do();
}
};
std::unique_ptr<Calc_Type> createJob(const std::string& name)
{
if (name = "A") {
return std::make_unique<A>();
} else if (name = "B") {
return std::make_unique<B>();
}
return std::make_unique<NoJob>();
}
// somewhere in the code:
auto job = createJob(userInput);
...
job->run();