Señalando una variable a una función miembro en c ++

Es sorprendente encontrar que la mayoría de los programadores de C ++ tienen ni idea de que un puntero llamado esta existe. Asi que esta es un gran secreto! Revel en ella! ¿Cuál es el secreto? El secreto es que se puede tomar la dirección de la función miembro de un objeto para que pueda acceder directamente a los datos de la instancia función miembro. Ooh-wee!

Ahora, recuerde que cada instancia de una clase obtiene su propia copia de las variables miembro, a menos que las variables son estáticas. Sin embargo, las funciones se comparten en toda la clase. Sí, se puede distinguir funciones estáticas de las funciones no estáticos.

Pero eso sólo lo que se refiere a tipos de variables que acceden: funciones estáticas pueden acceder a variables miembro estáticas solamente, y que no es necesario hacer referencia a ellos con una instancia. No estático (es decir, normal, habitualfunciones miembro) trabajan con una instancia particular. Sin embargo, dentro de la memoria, existe realmente una sola copia de la función.

Video: C++ - Intercambio de Variables

Entonces, ¿cómo sabe la función de miembro de la instancia a trabajar? Un parámetro secreto se pasa a la función de miembro: la esta puntero. Suponga que tiene una clase llamada gobstopper que tiene una función miembro llamada Masticar(). A continuación, usted tiene una instancia llamada MyGum, y se llama a la Masticar() la función de este modo:

MyGum.Chew () -

Cuando el compilador genera el código de montaje para esto, lo que realmente pasa un parámetro en la función - la dirección de la MyGum ejemplo, también conocido como el thispointer. Por lo tanto, sólo una Masticar() la función es en el código, pero llamarlo debe utilizar un caso particular de la clase.

Debido a que sólo una copia de la Masticar() la función está en la memoria, puede tomar su dirección. Pero para ello se requiere algún tipo de código de aspecto críptico. Aquí está, rápido y al grano. Suponga que su clase es el siguiente:

Gobstopper clase {public: int WhichGobstopper-int Chew (string name) {cout lt; lt; WhichGobstopper lt; lt; endl-cout lt; lt; nombre lt; lt; endl retorno WhichGobstopper -}} -

los Masticar() función toma una cadena y devuelve un entero. Aquí está un typedef para un puntero a la Masticar() función:

typedef int (Gobstopper :: * GobMember) (cadena) -

Y aquí es una variable del tipo GobMember:

GobMember func = &Gobstopper :: Chew-

Si te fijas bien en la typedef, tiene una apariencia similar a un puntero de función regular. La única diferencia es que el nombre de clase y dos colones preceden al asterisco. Aparte de eso, es un puntero de función regulares de edad.

Pero mientras que un puntero de función regular se limita a señalar que las funciones de un conjunto particular de los tipos de parámetros y un tipo de retorno, esta función de puntero acciones esas restricciones, pero tiene una limitación adicional: Sólo se puede apuntar a funciones miembro de la clase gobstopper.

Para llamar a la función almacenada en el puntero, es necesario tener un caso particular. Nótese que en la asignación de func en el código anterior no había ejemplo, sólo el nombre de la clase y la función, &Gobstopper :: Chew. Así que para llamar a la función, agarra una instancia, añadir func, ¡y ve!

los FunctionPointer02 ejemplo mostrado contiene un ejemplo completo con la clase, la dirección de función miembro, y dos instancias separadas.

#incluir #incluir utilizando Gobstopper espacio de nombres de clase std {public: int WhichGobstopper-int Chew (string name) {cout lt; lt; WhichGobstopper lt; lt; endl-cout lt; lt; nombre lt; lt; WhichGobstopper endl retorno -}} - int main () {int typedef (Gobstopper :: * GobMember) (cadena) -GobMember func = &Gobstopper :: Chew-Gobstopper inst-inst.WhichGobstopper = 10-Gobstopper otra-another.WhichGobstopper = 20- (inst. * Func) ("Greg W.") -. (Otro * func) ("Jennifer W.") -volver 0-}

Se puede ver en principal que primero se crea el tipo de la función, que se llama GobMember, y luego se crea una variable, func, de ese tipo. A continuación, se crea dos instancias de la gobstopper clase, y se les da a cada uno una diferente WhichGobstopper valor.

Por último, se llama a la función miembro, en primer lugar para la primera instancia y luego por la segunda instancia. Sólo para demostrar que se puede tomar las direcciones de funciones con parámetros, se pasa en una cadena con algunos nombres.

Cuando se ejecuta el código, se puede ver en la salida que es de hecho un llamamiento a la función miembro correcta para cada instancia:

10Greg W.20Jennifer W.

Ahora, cuando usted dice “la función miembro correcta para cada caso,” lo que De Verdad quieren decir es que el código está llamando a la misma función de miembro cada vez, pero utilizando una instancia diferente. Si usted está pensando en términos de orientación a objetos, considere cada instancia como tener su propia copia de la función miembro. Por lo tanto, está bien decir “la función miembro correcta para cada instancia.”

Artículos Relacionados