【问题标题】:Class member function pointer as a class member类成员函数指针作为类成员
【发布时间】:2011-12-21 19:33:36
【问题描述】:
// class
class MyClass
{
public:
void doIt() const
{
    cout << "It works!" << endl;
}

void(MyClass::*fPtr)() const;
};

// main

MyClass *t = new MyClass;

// store function address
t->fPtr = &MyClass::doIt;

(*(t->fPtr))(); // Whats wrong with this line?

如何调用存储在 fPtr 中的函数?当我尝试 (*(t->fPtr))();编译器给出 那些错误:

错误 C2171: '*' : 在 'void (__thiscall MyClass::* )(void) const 类型的操作数上非法

错误 C2064:术语不计算为采用 0 个参数的函数

【问题讨论】:

  • (t-&gt;*(t-&gt;fPtr))() 我认为应该可以工作
  • @KoKuToru:这也是错误的。
  • @KoKuToru:你能发表你的评论作为答案吗?

标签: c++ member-function-pointers


【解决方案1】:

(*(t-&gt;fPtr))(); 错误,正确的语法是((object)-&gt;*(ptrToMember))

意思

(t->*(t->fPtr))();

更多背景信息:http://www.parashift.com/c++-faq-lite/pointers-to-members.html (但最好忽略该页面中的这些宏..)

【讨论】:

    【解决方案2】:

    main() 函数的范围内没有名为fPtr 的变量。您需要使用 -&gt; 运算符引用成员变量,然后使用 -&gt;* 取消引用指向成员的指针:

    // main
    
    MyClass *t = new MyClass;
    
    // store function adress
    t->fPtr = &MyClass::doIt;   
    
    (t->*(t->fPtr))();
    

    或者,您可以创建一个局部变量并将指向成员的指针分配给它:

    // main
    
    MyClass *t = new MyClass;
    
    // store function adress
    t->fPtr = &MyClass::doIt;
    
    void (MyClass::*fp)() const = t->fPtr;
    (t->*fp)();
    

    后者清楚地说明了为什么需要上面看起来很奇怪的构造。您还可以在与您使用的成员指针类型的成员变量不同的对象上执行方法:

    MyClass *s = new MyClass;
    MyClass *t = new MyClass;
    
    s->fPtr = &MyClass::f;
    t->fPtr = &MyClass::g;
    
    (t->*(s->fPtr))(); // Call f() on object *t
    (s->*(t->fPtr))(); // Call g() on object *s
    

    -&gt; 左侧的对象告诉编译器从哪个对象读取指向成员的指针,而-&gt;* 左侧的对象告诉编译器调用成员函数的对象。

    【讨论】:

      猜你喜欢
      • 2013-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-27
      • 2013-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多