什么是C ++中的 - >*运算符?
-
21-09-2019 - |
题
C ++继续让我感到惊讶。今天,我发现了 - >*操作员。它是可超载的,但我不知道如何调用它。我设法在课堂上超载它,但我不知道如何称呼它。
struct B { int a; };
struct A
{
typedef int (A::*a_func)(void);
B *p;
int a,b,c;
A() { a=0; }
A(int bb) { b=b; c=b; }
int operator + (int a) { return 2; }
int operator ->* (a_func a) { return 99; }
int operator ->* (int a) { return 94; }
int operator * (int a) { return 2; }
B* operator -> () { return p; }
int ff() { return 4; }
};
void main()
{
A a;
A*p = &a;
a + 2;
}
编辑:
感谢答案。要调用超载函数我写
void main()
{
A a;
A*p = &a;
a + 2;
a->a;
A::a_func f = &A::ff;
(&a->*f)();
(a->*f); //this
}
解决方案
超载 ->*
操作员是二进制操作员(而 .*
不可超载)。它被解释为普通的二进制操作员,因此在您的原始情况下,为了打电话给操作员,您必须做类似的事情
A a;
B* p = a->*2; // calls A::operator->*(int)
您在Piotr的答案中阅读的内容适用于 内置 操作员,不要超载。您在添加的示例中所说的也是 内置 操作员,不是您的超载。为了调用超载操作员,您必须在上面的示例中做我的工作。
其他提示
就像 .*
, ->*
用于成员的指针。整个部分 在C ++常见问题解答Lite上 致力于指针至会员。
#include <iostream>
struct foo {
void bar(void) { std::cout << "foo::bar" << std::endl; }
void baz(void) { std::cout << "foo::baz" << std::endl; }
};
int main(void) {
foo *obj = new foo;
void (foo::*ptr)(void);
ptr = &foo::bar;
(obj->*ptr)();
ptr = &foo::baz;
(obj->*ptr)();
return 0;
}
像任何其他Opperator一样,您也可以明确称其为:
a.operator->*(2);
不隶属于 StackOverflow