Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解指向成员运算符的指针 我从一本C++练习册上抄袭了这个程序。幕后发生了什么_C++_Pointers_Compiler Errors_Dereference_Pointer To Member - Fatal编程技术网

理解指向成员运算符的指针 我从一本C++练习册上抄袭了这个程序。幕后发生了什么

理解指向成员运算符的指针 我从一本C++练习册上抄袭了这个程序。幕后发生了什么,c++,pointers,compiler-errors,dereference,pointer-to-member,C++,Pointers,Compiler Errors,Dereference,Pointer To Member,预期产出为: 总和=30总和=70 #包括 使用名称空间std; M类 { int x; int-y; 公众: 无效集_xy(整数a,整数b) { x=a; y=b; } 朋友整数和(M); }; 整数和(M); //到目前为止还不错,问题从这里开始。在这里之后发生了什么? { int M::*px=&M::x; int M::*py=&M::y; M*pm=&M; int s=m*px+pm->*py; 返回s; } int mai

预期产出为:

总和=30总和=70

#包括
使用名称空间std;
M类
{
int x;
int-y;
公众:
无效集_xy(整数a,整数b)
{
x=a;
y=b;
}
朋友整数和(M);
};
整数和(M);
//到目前为止还不错,问题从这里开始。在这里之后发生了什么?
{                               
int M::*px=&M::x;
int M::*py=&M::y;
M*pm=&M;
int s=m*px+pm->*py;
返回s;
}
int main()
{
M n;
void(M::*pf)(int,int)=&M::set_xy;
(n.*pf)(10、20);

cout问题是由于
op->*pf
处的额外空格造成的:

 (op->*pf)(30,40);  // ok
我认为@fefe可能在评论中提到了原因。
->*
是一个单独的运算符,类似于
*
。因此,如果这两个运算符分开,则会导致不同的语法,从而导致编译器错误。

请看一看。对于错误,->*是一个运算符,您不能在它们之间加空格。

打赌我会出错;
op->*pf
必须更改,以便将
->*
作为单个运算符-a(找不到更好的链接)。
op->*pf
中的空格完全有效

类似于
i++
++
是一个单独的运算符,如果尝试使用
i++
,则会导致错误

现在来看看它在做什么。这个例子是一个指向成员函数的指针。
pf
被声明为
class M
的成员函数,它使用两个
int
参数,返回类型为
void
。它被初始化为指向
M::set_xy
函数

内部
main

  • n
    属于
    M
    类型,因此,为了使用
    pf
    调用
    set_xy
    n
    *
    操作符:
    (n.*pf)(10,20);
    。这相当于
    n.set_xy(10,20);

  • 由于
    op
    属于
    M*
    类型(指向
    M
    对象的指针),因此需要使用
    ->*
    操作符,并将
    pf
    指向的函数调用为:
    (op->*pf)(30,40);
    ,这相当于
    op->set_xy(30,40);

内部
总和

  • 这些示例只是指向成员/实例变量的指针,而不是成员函数。它只是演示如何使用这些类型的指针将
    m.x
    m.y
    相加

“->*”是一个运算符,而不是两个运算符。因此它们不能分开。您不能写入“->*”。该问题已解决。请有人解释一下它的工作原理吗?删除标记“visual studio”,因为它不是编译器的特定问题。ignore();getchar()是Visual Studio .jeT.Mg的命令,是命令,是VS,但不是编译器错误问题,我读到C++中不关心空白的地方。我们试试如果它工作。@ JeET.MG:操作符是代码> > *>代码>。你不能把空间放在你喜欢的地方(比如<代码> Dele Te/Cuff>不与<代码>删除< /代码>相同)这个问题解决了。有人能解释一下它的工作原理吗?@jeet.mg,这是一个不同的问题。你可能需要先看看你的代码,如果不理解,你可以发布另一个问题。
 (op->*pf)(30,40);  // ok