我正在尝试使用虚方法表在类中按索引调用函数...假设我们有以下代码:
class Base
{
public:
Base() {}
virtual ~Base() {}
virtual Base* call_func(unsigned int func_number)
{
// Some way to call f_n
}
protected:
virtual Base* f_1() const = 0;
virtual Base* f_2() const = 0;
virtual Base* f_3() const = 0;
};我已经使用函数数组if-statement和case-statement实现了这一点...那么,有没有一种更好的方法来只使用指针(例如访问vtable )或类似的东西来调用方法呢?
为我糟糕的英语道歉:并提前感谢!
编辑:感谢您的建议!我将扩展我的问题:
在解决这个问题之后,我将使用f_1、f_2、f_3的不同实现创建派生类(例如derived1和派生2),并拥有一个如下所示的类控件:
class Control
{
protected:
Base* current;
public:
Control(Base* curr = new derived1): current(curr) {}
virtual ~Control()
{
delete current;
}
virtual void do_something(unsigned int func_numb)
{
delete current
Base* new = current->next_state(stl);
current = new;
}
};发布于 2012-12-12 21:54:25
switch语句:
switch (func_number)
{
case 1:
f_1();
break;
case 2:
f_2();
break;
case 3:
f_3();
break;
}或者使用函数指针数组。
发布于 2012-12-12 22:13:16
没有可移植的方法来访问虚拟函数表;语言规范没有指定应该如何实现虚拟分派,因此甚至没有要求表必须存在,更不用说程序可以访问了。
没有比您提到的方法更好的方法了:函数指针表或if/switch条件。
发布于 2012-12-12 22:56:31
我假设你只是想找到所有可能的方法来解决它。
您可以使用指向成员函数的指针的map (或vector),并将其初始化一次(在构造函数中或静态地)。它可以模仿vtable。
这些字里行间的东西:
class Base
{
public:
Base() {
functions.insert(std::make_pair(1,&Base::f_1));
functions.insert(std::make_pair(2,&Base::f_2));
functions.insert(std::make_pair(3,&Base::f_3));
}
virtual ~Base() {}
virtual Base* call_func(unsigned int func_number)
{
return (this->*functions[func_number])();
}
protected:
std::map<unsigned int, Base*(Base:: *)()const> functions;
virtual Base* f_1() const = 0;
virtual Base* f_2() const = 0;
virtual Base* f_3() const = 0;};
即使对于继承的类,这也应该有效(不过,我会将call_func设为非虚拟的)。是的,你应该检查项目是否真的在地图(或矢量)中,以及它是否不是一个nullptr。
https://stackoverflow.com/questions/13841248
复制相似问题