在不事先了解特定成员函数的情况下从另一个类访问成员函数

时间:2012-07-16 01:24:04

标签: c++ oop function-pointers

我想创建一个可以访问一族类的成员函数的类。进入更多细节,我有类ControlChaos,声明如下:

#define CALL_MEMBER_FN(object, ptrToMember) ((object)->*(ptrToMember))

typedef double (MultiMaps::*mapsGetPtr)();
typedef void (MultiMaps::*mapsSetPtr)(double para);

class ControlChaos
{
public:
    ControlChaos(MultiMaps* _map,
                 mat orbitPoints,
                 colvec initCond,
                 mapsGetPtr getPtr,
                 mapsSetPtr setPtr,
                 double deltaMax,
                 double epsilonNeighborhood,
                 int controlIterations,
                 int maxIterations);

/* Other stuff here. */
};

带有受保护的成员变量,其类型为mapsGetPtr和mapsSetPtr,以及其他变量。在实现中,我使用

 CALL_MEMBER_FN(map,setPtr)(someParameter);

使用ControlChaos构造函数中的函数指针调用我指定的函数。我想要访问的成员函数是从MultiMaps派生的类的成员。这段代码本身编译得很好。当我尝试使用指向从MultiMaps派生的类中的成员函数的函数指针实例化ControlChaos对象时,编译器会抱怨我给了它错误的参数类型。

此外,这个article似乎意味着静态演员可以胜任这项工作,但我没有发现这是真的。

关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:1)

static_cast 确实只需要将类型Child::*指针指向成员转换为Base::*类型,以下代码段:

struct ChildOfMultiMap : MultiMap { 
   ...
};

...

void(ChildOfMultiMap::* child_mem_ptr)(double) = &ChildOfMultiMap::set;

mapsSetPtr ptr = static_cast<mapsSetPtr> (child_mem_ptr);

请记住,如果您偶然在Base的实例上使用指向成员的指针(而不是相关的{{ 1}})。


这会有什么危险?

在下面的代码段中,我们使用与前面描述的完全相同的方法,尽管在Child类型的对象上调用Child::func会导致 undefined-behavior ,因为我们正在访问函数内部的不存在的成员。

Base

struct Base {
  /* ... */
};

struct Child : Base {

  void func () {
    this->x = 123;
  }

  int x;
};