指向成员函数语法的指针

时间:2016-08-20 17:08:56

标签: c++ class pointers member-function-pointers member-functions

我试图围绕指向成员函数的指针,并坚持这个例子:

#include <iostream>

class TestClass {
  public:
    void TestMethod(int, int) const;
};

void TestClass::TestMethod(int x, int y) const {
  std::cout << x << " + " << y << " = " << x + y << std::endl;
}

int main() {
  void (TestClass::*func)(int, int) const;
  func = TestClass::TestMethod;

  TestClass tc;
  tc.func(10, 20);

  return 0;
}

我认为代码应该做什么:

  • 在main的第一行,我声明了一个指向class TestClass的成员函数的指针,该函数返回任何内容/需要两个int并且被声明为const,被调用的 FUNC 即可。
  • 第二行将成员函数TestMethod(类TestClass)分配给func,满足这些条件。
  • 第四行创建一个名为 tc TestClass对象。
  • 第五行尝试在func - 对象TestClass上调用tc指向的成员函数。

我收到两个编译错误:

  • 而不是将TestClass::TestMethod分配给func。编译器尝试调用TestClass::TestMethod(即使它不是static,因此会抛出错误):

    testPointerToMemberFunc.cpp:14:21: error: call to non-static member function without an object argument
      func = TestClass::TestMethod;
             ~~~~~~~~~~~^~~~~~~~~~
    
  • 编译器尝试在func上调用名为tc的函数,而不是func指向的函数。对我而言,似乎func没有被宣布为正确的方式(作为指向成员函数的指针):

    testPointerToMemberFunc.cpp:17:6: error: no member named 'func' in 'TestClass'
      tc.func(10, 20);
      ~~ ^
    

我做错了什么?

3 个答案:

答案 0 :(得分:1)

func = TestClass::TestMethod;应为func = &TestClass::TestMethod;tc.func(10, 20)应为(tc.*func)(10, 20)(在后者中,请注意两个更改:{{ 1}}变为.,并且添加了括号;两者都是必需的。)

答案 1 :(得分:1)

简单的语法细微之处。

func = &TestClass::TestMethod;
//     ^ Missing ampersand to form a pointer-to-member

TestClass tc;
(tc.*func)(10, 20);
// ^^ Using the dot-star operator to dereference the pointer-to-member,
// while minding its awkward precedence with respect to the call operator.

答案 2 :(得分:1)

指向成员(函数或其他)的指针与常规指针非常不同,尽管语法有些相似之处。常规函数作为指向函数的指针的方式,反之亦然,是从C继承的,但C不支持指向成员的指针,因此没有必要在C ++中以这种方式工作。

要创建指向成员的指针,您必须明确使用&,并且必须明确使用.*来间接它,如果您不使用它可能会更多函数在C中的工作方式:

func = &TestClass::TestMethod;
(tc.*func)(10, 20);