我试图围绕指向成员函数的指针,并坚持这个例子:
#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;
}
我认为代码应该做什么:
class TestClass
的成员函数的指针,该函数返回任何内容/需要两个int
并且被声明为const
,被调用的 FUNC 即可。TestMethod
(类TestClass
)分配给func
,满足这些条件。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); ~~ ^
我做错了什么?
答案 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);