Tutoriales

Punteros de función miembro de C++

En C++, los indicadores de funciones miembro ayudan a hacer referencia a funciones miembro de una clase. Proporcionan una forma de guardar y llamar funciones miembro en instancias de clase, proporcionando flexibilidad y extensibilidad en una variedad de situaciones. Un uso común de los indicadores de funciones miembro es que se deben activar diferentes comportamientos en función de las condiciones de tiempo de ejecución. Las aplicaciones pueden utilizar punteros a funciones miembro para seleccionar e invocar dinámicamente el comportamiento apropiado. Además, los indicadores de funciones de miembros son útiles en situaciones en las que se requiere el desacoplamiento de elementos del sistema.

Ejemplo 1:

Incluimos el archivo de encabezado «iostream» para utilizar fácilmente las funciones definidas. Luego, tenemos «espacio de nombres estándar». Debajo de esto, creamos una clase llamada «MyNewClass» y usamos el constructor «público».

En «público», creamos una función miembro llamada «myFunc» y declaramos «int num» como parámetro de «myFunc()». A continuación, usamos «cout» y llamamos al método main() a continuación, donde establecemos el puntero de la función miembro. Declaramos «MyFuncPtr» como un puntero al tipo de función miembro, especificando la categoría «MyNewClass» y el tipo de parámetro (int).

Después de eso, creamos un objeto de clase llamado «Class_obj» y luego llamamos a la función miembro colocando el objeto de clase y esto con la ayuda del puntero «*MyFuncPtr». Cuando llamamos al puntero de función miembro, asignamos «10» como parámetro para representar esto.

Código 1:

#incluir

Usar espacio de nombres estándar;

CategoríaMi nueva categoría {

gente:

blanco mi función(entero número de serie) {

kut «El valor es» número de serie endel;

}

};

entero principal() {

blanco (mi nueva clase::*mi puntero de función)(entero) = &mi nueva clase::mi función;

Mi nueva clase Class_obj;

(categoría_obj.*mi puntero de función)(10);

devolver ;

}

Producción:

Esto ilustra cómo funcionan los indicadores de funciones miembro. Los indicadores de funciones miembro se pueden utilizar para iniciar dinámicamente funciones miembro en función de la situación actual.

Ejemplo 2:

Para utilizar simplemente las funciones definidas en el archivo de encabezado «iostream», incluimos «iostream» aquí. El siguiente es «espacio de nombres estándar». Debajo, creamos la clase «Prueba» y luego usamos el constructor «público». Definimos la función miembro «myTestingFunc» en «public» y configuramos «int t_value» como parámetro de «myTestingFunc()» en este ejemplo. Luego use la función «cout» y llame al método main(). Luego, construimos indicadores de funciones miembro.

Aquí especificamos la categoría «Prueba» y el puntero de función miembro «*MyTestFuncPtr». Asignamos «&Test::myTestingFunc» al puntero de función miembro declarado como «void (Test::*MyTestFuncPtr)(int)».

A continuación, generamos el objeto de clase «t_obj» y lo usamos para llamar a funciones miembro colocando el objeto de clase y usando el puntero «*MyTestFuncPtr». Para representar esto al llamar al indicador de función miembro, asignamos «932» como argumento.

Código 2:

#incluir

Usar espacio de nombres estándar;

examen de clase {

gente:

blanco mi función de prueba(entero valor_t) {

kut «El valor de la prueba es» valor_t endel;

}

};

entero principal() {

blanco (prueba::*mi puntero de función de prueba)(entero) = &prueba::mi función de prueba;

Prueba t_obj;

(t_obj.*mi puntero de función de prueba)(Capítulo 932);

devolver ;

}

Producción:

Presenta los resultados del código dado. Podemos ver que llamamos al «puntero de función miembro» usando el objeto de clase, como se muestra a continuación.

Ejemplo 3:

La clase que generamos en este código es «MyNewCar», donde usamos el constructor «público» y creamos una función miembro «startCarEngine()» en él. En esta función agregamos «cout» que se representará cuando llamemos a esta función en nuestro código. Luego, creamos otra función miembro «stopCarEngine()» y usamos «cout» nuevamente en esta función miembro.

Después de eso, llamamos a la función main() y luego declaramos el puntero de función miembro «MyNewCar::*carEngineFunc()». Debajo de esto, creamos un objeto de clase «MyNewCar» llamado «myCar_obj». Luego asignamos la función «startCarEngine» al indicador «carEngineFunc». Debajo de esto, llamamos a la función con la ayuda del puntero «carEngineFunc» poniendo el nombre del objeto en él.

A continuación, reasignamos la función «stopCarEngine» al indicador «carEngineFunc». A continuación, llamamos a la función pasando el nombre del objeto y la referencia «carEngineFunc».

Código 3:

#incluir

Usar espacio de nombres estándar;

Clase MyNewCar {

gente:

blanco Arrancar el motor del coche() {

kut «El motor del coche arrancó» endel;

}

blanco detener el motor del auto() {

kut «El motor del coche se paró» endel;

}

};

entero principal() {

blanco (mi auto nuevo::*características del motor del coche)();

Mi auto nuevo myCar_obj;

características del motor del coche = &mi auto nuevo::Arrancar el motor del coche;

(miCar_obj.*características del motor del coche)();

características del motor del coche = &mi auto nuevo::detener el motor del auto;

(miCar_obj.*características del motor del coche)();

devolver ;

}

Producción:

Esto muestra cómo funciona el «Indicador de función de miembro». Podemos ver que creamos el indicador de función miembro y mostrar los resultados aquí.

Ejemplo 4:

Después de incluir el archivo de encabezado y el «espacio de nombres estándar», declaramos aquí la clase «MyNewStudent». La función miembro «studentPass()» es una de las funciones miembro que construimos para la clase «MyStudentClass» generada aquí. También agregamos «cout» a esta función, que se representará cuando la llamemos en nuestro código.

A continuación, escribimos la función miembro «studentFail()», que usa «cout» nuevamente. Luego llame a la función main() y declare el puntero de función miembro «(MyNewStudent::*studentResultFunc)()». A continuación generamos el objeto «myStd_obj» perteneciente a la categoría «MyNewStudent».

A continuación, asignamos la función «studentPass» al indicador «studentResultFunc». A continuación, llamamos a la función pasando el nombre del objeto y la referencia «studentResultFunc». La función «studentFail» se reasigna al indicador «studentResultFunc». A continuación, llamamos a este método proporcionando la referencia «carEngineFunc» y el nombre del objeto.

Ahora, aquí se llaman ambas funciones y se representan las declaraciones que incluimos dentro de estas funciones.

Código 4:

#incluir

Usar espacio de nombres estándar;

Mi clase de nuevo estudiante {

gente:

blanco Tarjeta de estudiante() {

kut «Tarjeta de estudiante» endel;

}

blanco estudiante reprobado() {

kut «Este estudiante fracasó» endel;

}

};

entero principal() {

blanco (mi nuevo estudiante::*función de resultado del estudiante)();

Mi nuevo alumno myStd_obj;

función de resultado del estudiante = &mi nuevo estudiante::Tarjeta de estudiante;

(myStd_obj.*función de resultado del estudiante)();

función de resultado del estudiante = &mi nuevo estudiante::estudiante reprobado;

(myStd_obj.*función de resultado del estudiante)();

devolver ;

}

Producción:

Creamos funciones miembro en nuestro código y luego creamos punteros de funciones miembro. Después de eso llamamos a la función miembro y mostramos el resultado aquí.

Ejemplo 5:

Cree «SampleClass» en este caso. Luego, el puntero de la función miembro se coloca aquí, es decir, «(SampleClass::*MyFunc)()». Debajo de esto, creamos el puntero de función «(*MyFuncPtr)()». Debajo, declaramos el «nombre» de la variable «cadena», así como el puntero de función miembro «MyFunc f».

Después de eso, tenemos el constructor «público» en el que definimos esta variable de función miembro. Debajo de esto, creamos funciones miembro llamadas «myFunc_1()» y «myFunc_1()» y agregamos «cout» a cada función miembro. Cuando llamamos a la función miembro, se mostrará la función miembro.

Luego, usamos «(this->*f)()» para llamar a este puntero de función miembro. Luego colocamos la función nuevamente. Aquí cambiamos la declaración «cout» agregada anteriormente. Luego, llame a «main()» y defina el puntero de función miembro como «MyFunc f = &SampleClass::myFunc_2».

Entonces, el puntero de función también se define como «MyFuncPtr fp = myFunc_1». Después de eso, escribimos «(a.*f)()» para usar el indicador de función miembro. «b.func» se coloca para aprovechar las funciones de los miembros. Luego, colocamos «fp()» para llamar al puntero de función.

Código 5:

#incluir

Usar espacio de nombres estándar;

clase de muestra de clase;

definición de tipo blanco (clase de muestra::*mi función)();

definición de tipo blanco (*mi puntero de función)();

clase de muestra de clase{

nombre de cadena;

mi función;

gente:

clase de muestra(constante personaje* Nombre)

:Nombre(Nombre),

F(&clase de muestra::miFunc_1)

{}

blanco miFunc_1(){ kutNombre «Aquí llamamos a la función 1» endel;}

blanco miFunc_2(){ kutNombre «Aquí llamamos a la función 2» endel;}

blanco Función(){

(este->*F)();

}

};

blanco miFunc_1(){ kut«Primera función» endel;}

blanco miFunc_2(){ kut«Segunda función» endel;}

entero principal()

{

mi función = &clase de muestra::miFunc_2;

MiFuncPtr fp = miFunc_1;

Clase de muestra A(«Primero-«), Segundo(«segundo- «);

(A.*F)();

b.Función();

FP();

}

Producción:

El resultado del código ahora se representa aquí y cuando llamamos a la función en el código, mostrará el resultado en consecuencia.

en conclusión

Exploramos cómo los «indicadores de funciones miembro» en C++ simplifican el enlace dinámico, la encapsulación de comportamiento y el manejo flexible de llamadas a funciones en un contexto de programación orientada a objetos. Aprendimos que el uso de indicadores de funciones miembro puede aumentar significativamente la modularidad y flexibilidad de las bibliotecas de código C++, proporcionando una herramienta poderosa para resolver muchos desafíos de diseño y tiempo de ejecución.

LEER  MODEFLATTENER - OLLVM DEFLATTENER PARA MISM

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba