c++ - Comprender los operadores Pointer-to-Member
pointers compiler-errors (3)
Copié este programa de un libro de práctica de C ++. ¿Qué está pasando detrás de escena?
El resultado esperado es:
suma = 30 suma = 70
#include<iostream>
using namespace std;
class M
{
int x;
int y;
public:
void set_xy(int a, int b)
{
x=a;
y=b;
}
friend int sum(M m);
};
int sum (M m);
//so far so good, problem begins from here. what''s happening after here?
{
int M ::*px = &M ::x;
int M ::*py = &M ::y;
M *pm =&m;
int s= m.*px+ pm->*py;
return s;
}
int main()
{
M n;
void (M :: *pf)(int, int) = &M ::set_xy;
(n.*pf)(10, 20);
cout <<"sum=" << sum(n) << endl;
M *op= &n;
(op-> *pf)(30,40);
cout << "sum=" << sum(n)<< endl;
cin.ignore();
getchar();
return 0;
}
El problema se debe a espacios en blanco adicionales en op-> *pf
:
(op->*pf)(30,40); // ok
Creo que @fefe probablemente haya dicho la razón en el comentario. ->*
es un operador único, similar a .*
. Entonces, si esos 2 están separados, entonces dará como resultado una sintaxis diferente, lo que da un error de compilación.
Eche un vistazo a Puntero a datos de clase . Y para el error, -> * es un operador, no puede poner un espacio entre ellos.
iammilind me apuntó al error; op-> *pf
debe cambiarse para que tenga ->*
juntos como un solo operador - un puntero al operador miembro (no pudo encontrar un mejor enlace). El espacio en blanco en op ->* pf
es perfectamente válido.
Eso es lo mismo para algo como i++
; ++
es un operador único y causará un error si intentas tener i+ +
.
Ahora por lo que está haciendo. El ejemplo es un puntero a una función miembro . pf
se declara como una función miembro de la class M
, que toma dos argumentos int
con un tipo de retorno void
. Se está inicializando para apuntar a la función M::set_xy
.
Interior main
:
n
es de tipoM
, por lo tanto, para usarpf
para llamar aset_xy
den
, usaría el operador.*
:(n.*pf)(10, 20);
. Eso es equivalente an.set_xy(10, 20);
.Como
op
es de tipoM*
(un puntero a un objetoM
), necesitará usar el operador->*
y llamar a la función señalada porpf
como:(op->*pf)(30, 40);
, que es equivalente aop->set_xy(30, 40);
sum
interna:
- Los ejemplos son simplemente punteros a variables miembro / instancia, a diferencia de las funciones miembro. Simplemente está demostrando cómo se sumarían
mx
ymy
uso de esos tipos de punteros.