我之前从未使用它,只是在一篇文章中偶然发现它......我认为它等同于*x->y
,但显然不是。{/ p>
这是我尝试过的,并给了我一个错误:
struct cake {
int * yogurt;
} * pie;
int main(void) {
pie = new cake;
pie->yogurt = new int;
return pie->*yogurt = 4;
}
答案 0 :(得分:4)
当你有指向成员函数的指针时使用它。
当你有一个指向类函数的指针时,你调用它的方式与调用任何成员函数的方式非常相似
object.membername(...)
或
objectptr-> membername(...)
但是当你有一个成员函数指针时,需要额外的*。或 - >为了让编译器理解下一步是变量,而不是要调用的函数的实际名称。
这是一个如何使用它的例子。
class Duck
{
public:
void quack() { cout << "quack" << endl; }
void waddle() { cout << "waddle" << endl; }
};
typedef void (Duck::*ActionPointer)();
ActionPointer myaction = &Duck::quack;
void takeDuckAction()
{
Duck myduck;
Duck *myduckptr = &myduck;
(myduck.*myaction)();
(myduckptr->*myaction)();
}
答案 1 :(得分:3)
它定义了pointer to a member。
在包含 - &gt; *运算符的表达式中,第一个操作数必须为 是指定类型的“指向类类型的指针”类型 第二个操作数,或者它必须是明确派生的类型 那个班。 MSDN
答案 2 :(得分:2)
答案 3 :(得分:0)
。*和 - &gt; *运算符将指向类或结构的成员函数。下面的代码将显示如何使用。*运算符的简单示例,如果更改行:
Value funcPtr = &Foo::One;
到Value funcPtr = &Foo::Two;
显示的结果将更改为1000,因为该函数为inValue*2
#include <iostream>
#include <stdlib.h>
class Foo {
public:
double One( long inVal ) { return inVal*1; }
double Two( long inVal ) { return inVal*2; }
};
typedef double (Foo::*Value)(long inVal);
int main( int argc, char **argv ) {
Value funcPtr = &Foo::One;
Foo foo;
double result = (foo.*funcPtr)(500);
std::cout << result << std::endl;
system("pause");
return 0;
}