utilice sirve sintaxis que punteros puntero ptr para miembro funcion estándar crear clase c++ typedef

c++ - sirve - sintaxis typedef con punteros de función miembro



typedef c++ para que sirve (9)

El sinónimo (MyTypedef) está en el medio?

No está en el medio. Solo olvide la función miembro por un tiempo, vea cómo se define un puntero de función:

int (*FuncPtr)(int);

Y así es como lo escribirías:

typedef int (*FuncPtr)(int);

¡Sencillo! La única diferencia es que, en typedef, FuncPtr convierte en un tipo , mientras que en la declaración del puntero, FuncPtr es una variable .

Similar,

int (MyClass::*MyTypedef)( int); //MyTypedef is a variable

Y la typedef como:

typedef int (MyClass::*MyTypedef)( int); //MyTypedef is a type!

Según MSDN la sintaxis de typedef es:

typedef tipo-declaración de sinónimos;

Muy fácil:

typedef int MY_INT;

Pero, ¿cómo diablos cumple esta regla la función typdefs miembro-función-puntero?

typedef int (MyClass::*MyTypedef)( int);

100% de confusión: ¿el sinónimo ( MyTypedef ) está en el medio?

¿Puede alguien explicar cuáles son los pasos lógicos para pasar del muy fácil de entender el formato de sintaxis de MSDN a la sintaxis inversa / aleatoria / frontal / última / mixta de abede typedef?

* Editar gracias por todas las respuestas rápidas (y el embellecimiento de mi publicación) :)


¿Cómo se define un puntero a la función miembro? Me gusta esto:

int (A::*variableName)(int);

Para convertirlo en un typedef, simplemente agregue un typedef:

typedef int (A::*typedefName)(int);


El principio para la declaración en C ++ es que imitan el uso. Si desea utilizar un puntero a la función miembro pmf, escribirá:

(myVar.*pmf)(arg);

así que para definir un typedef para eso, escribes:

typedef int (MyClass::*pmf)(int);

agregando el tipo de retorno en la cabecera, reemplazando la variable por el tipo y los argumentos por su tipo.


La página a la que te refieres es probablemente " Typedef Specifier ". La simplista " typedef type-declaration synonim; " sintaxis es sólo una de las muchas formas de usar typedef. No hay (probablemente) una manera simple y concisa de describir cómo se puede usar typedef. Para eso está la página de MSDN " Declaraciones Typedef ".

Notarás en esta página algo como:

declaration: declaration-specifiers init-declarator-list opt ; declaration-specifiers: storage-class-specifier declaration-specifiers opt type-specifier declaration-specifiers opt type-qualifier declaration-specifiers opt storage-class-specifier: typedef

Más detalles sobre qué declaración-especificadores y init-declarator-list se pueden encontrar here .

Esta es una forma rigurosa de entender todos los usos posibles para "typedef".

Lo que básicamente dice esta página es que "typedef" se puede usar antes de la mayoría de las declaraciones válidas.


La sintaxis de usar el puntero de función miembro tiene que (asume que es una instancia de clase A ):

  • en declaración, use "A ::" como prefijo
  • cuando lo uses, usa "a". como prefijo

A continuación se muestra un ejemplo de juguete. Puedes jugar con eso.

#include <stdio.h> #include <stdlib.h> class A; typedef int (A::*F)(double); class A { public: int funcDouble(double x) { return (int)(x * 2.0); } int funcTriple(double x) { return (int)(x * 3.0); } void set(int a) { if (a == 2) { this->f_ = &A::funcDouble; } else if (a == 3) { this->f_ = &A::funcTriple; } else { this->f_ = NULL; } } public: F f_; }; int main(int argc, char *argv[]) { A a; a.set(2); F f = &A::funcDouble; printf("double of 1 = %d/n", (a.*f)(1)); // Below is equivalent to: // F f2 = a.f_; // printf("double of 1 = %d/n", (a.*f2)(1)); printf("double of 1 = %d/n", (a.*(a.f_))(1)); a.set(3); printf("triple of 1 = %d/n", (a.*(a.f_))(1)); return 0; }


Sé que ya tiene su respuesta, pero desea compartir esto: es útil: http://www.cdecl.org . Es una declaración C / C ++ <-> traductor de inglés. Solo escribe

declare x como puntero al miembro de la clase A función (int) que devuelve carácter

y obtienes char (A::*x)(int ) . O juegue con la declaración y vea si obtiene lo que desea.


Será más fácil de entender cuando empieces a pensar así:

Cada vez que veas una función como esta:

TYPE foo(int arg1, int arg2);

Usted dice que el tipo de foo es TIPO. Entonces, el tipo de

int get_next_prime();

es int

Puedes ver que cuando pasas un puntero a una función como un argumento a una función:

void register_callback(void (*ptr)(int));

En este caso, está pasando una función de tipo void como argumento.

Ahora, cuando veas algo así:

typedef int (A::*typedefName)(int);

solo está diciendo que la variable (A :: * typedefName) (int) (esto es solo una cosa, no dos, ya que es una declaración de puntero de función) en realidad es de tipo int. A partir de entonces, el compilador interpretará A :: * typedefName como una función de tipo int, es decir, devuelve un valor int.

Espero que lo haga menos confuso.


Una vez leí una buena explicación (pero es de Expect C Programming, así que ymmv):

De hecho, un typedef tiene exactamente el mismo formato que una declaración de variable, solo con esta palabra clave adicional para avisarle.

Dado que typedef se ve exactamente como una declaración de variable, se lee exactamente como una. En lugar de la declaración que dice "este nombre se refiere a una variable del tipo indicado", la palabra clave typedef no crea una variable, sino que hace que la declaración diga "este nombre es un sinónimo del tipo indicado".

Así que ahí lo tienen. Imagina que estás declarando una variable, pega typedef antes y voila, tienes un nuevo tipo. MSDN explicaciones de MSDN son una mezcla: he leído realmente las de Dios y las que realmente son malas.


Vale la pena señalar que, a partir de C ++ 11, podría escribir esta expresión como una declaración de using más legible:

using MyTypedef = int (MyClass::*)(int);