我正在开发一个项目,我希望它可以指定使用几类方法/算法/函数中的哪一类。每个方法“class”提供类似的功能,并且可以与其他类互换。
我试图用一个基础抽象类来实现它,方法“classes”作为派生类:
class Method {
public:
virtual int function1(int) = 0;
virtual int function2(int, int) = 0;
};
class Method1 : public Method {
public:
int function1(int a) {
return a * 2;
}
int function2(int a, int b) {
return a + b;
}
};
class Method2 : public Method {
public:
int function1(int a) {
return a / 2;
}
int function2(int a, int b) {
return a - b;
}
};
void useMethod(int a, int b, Method& m) {
int result1 = m.function1(a);
int result2 = m.function2(a, b);
/* Do something with the results here */
}
int main() {
// Doesn't work, "type name is not allowed"
useMethod(1, 2, Method1);
useMethod(1, 2, Method2);
// Works, but seems unnecessary and less elegant
Method1 x;
useMethod(1, 2, x);
Method2 y;
useMethod(1, 2, y);
return 0;
}
问题是我似乎无法弄清楚如何允许使用Method1
和Method2
而不创建它们的实例 - 这在我看来是不必要的,因为它们都只是提供功能相同。 有没有办法让派生类排序为“静态”,这样可以在没有实例的情况下使用它们?
答案 0 :(得分:4)
你可以做到:
useMethod(1, 2, Method1());
useMethod(1, 2, Method2());
否则,您不能使用static virtual
方法。你可以用模板实现类似的东西:
template<typename T>
void useMethod(int a, int b)
{
int result1 = T().function1(a); //or if you made the methods static then T::method1(a)
int result2 = T().function2(a, b); //ditto
/* Do something with the results here */
}
用法:
useMethod<Method1>(1, 2);
然后您不需要基本抽象类,也不需要虚拟方法。如代码注释中所述,您可以将方法设置为静态,然后不需要类的实例。