Puntero de función a función miembro en C++

Jay Shaw 12 octubre 2023
  1. Implementar el puntero de función a la función miembro en C++
  2. Fijar un puntero a una función miembro en C++
  3. Llame a una función de puntero a miembro sin usar el símbolo de puntero en C++
  4. Proporcione un método de la misma clase que el puntero de función en C++
  5. Puntero de función a función miembro usando comando de cadena en C++
Puntero de función a función miembro en C++

Cuando se crea una variable en lenguajes de programación, la máquina debe almacenar su valor en la memoria de la computadora. La máquina asigna algo de memoria a esta variable, esté vacía o no.

A menudo se requiere la ubicación en lugar de los valores de una variable. Durante ese tiempo, estos valores se pueden obtener a través de punteros.

Además, los punteros en C++ también se pueden usar para apuntar a un fragmento de código, como una función, en comparación con la referencia a una dirección de memoria. Estos se denominan punteros de función, lo que aumenta la eficiencia del código.

Los ejemplos de este artículo mostrarán claramente cómo se pueden emplear punteros de función dentro de una clase para hacer que los punteros apunten a una función miembro en C++.

Implementar el puntero de función a la función miembro en C++

Hay dos maneras a través de las cuales esto se puede hacer.

  1. Se crea un puntero de función que apunta a una función miembro.
  2. Llamar a un método usando solo el nombre del puntero de función.

Fijar un puntero a una función miembro en C++

Se requieren los siguientes pasos para utilizar una función de puntero.

  1. Una función parametrizada con un tipo de valor devuelto: nulo.
  2. Escriba Casting la variable de puntero.
  3. Asignar la variable puntero a un método.
  4. Una llamada de método que utiliza el puntero para llamar a la función parametrizada dentro de la función principal.

El paquete estándar stdio se importa para funciones de entrada/salida dentro del programa. Una función display se declara con un parámetro var1, con un tipo de dato entero.

void display(int var1) { printf("The variable holds value = %d\n", var1); }

Dentro del método display, se imprime var1.

La variable ptr_method tiene un tipo de datos vacío dentro de la función principal. Debe tenerse en cuenta que void se puede usar como un tipo de datos en C++, pero actúa como un marcador de posición y no representa realmente un tipo de datos.

A la variable de puntero declarada se le proporciona un parámetro entero como:

void (*ptr_method)(int)

El ptr_method tiene un parámetro entero. Esto pasará un valor al método miembro al llamar a ptr_method.

Debido a que el uso de cualquier otro tipo de datos da como resultado un error de conversión incorrecto con el compilador, a la función de puntero ptr_method se le ha dado un tipo de datos vacío.

El puntero de función se asigna a la función declarada al inicio del programa utilizando la siguiente sintaxis. Utilice la siguiente sintaxis para hacer que el puntero apunte hacia la función display.

ptr_method = &display;

Finalmente, se llama a la función puntero con el parámetro entero proporcionado como "65".

Código:

#include <stdio.h>

// This method has a parameter int and a return type which is void

void display(int var1) { printf("The variable holds value = %d\n", var1); }

int main() {
  void (*ptr_method)(int);
  ptr_method = &display;

  (*ptr_method)(65);

  return 0;
}

Producción :

The variable holds value = 65

Llame a una función de puntero a miembro sin usar el símbolo de puntero en C++

El programa utilizado en este ejemplo es el mismo que el anterior excepto por la llamada a la función. Aquí, la variable de puntero se llama usando el nombre de la variable, excluyendo el signo de asterisco (*).

El programa funciona según lo previsto porque cuando un puntero de función apunta hacia un método, se puede acceder a la dirección de memoria del método almacenado en él utilizando tanto el puntero como la forma variable. Por ejemplo, cuando se define el puntero de la función ptr_method, la asignación de la función display se logra utilizando el nombre de la variable directamente en lugar de agregar un & delante del nombre de la variable como en el ejemplo anterior.

En la llamada de función, el puntero de función ptr_method se llama directamente sin el símbolo de puntero (*) y se le pasa el valor 54.

void (*ptr_method)(int);
ptr_method = display;

ptr_method(54);

Código:

#include <stdio.h>

void display(int var1) { printf("The variable holds value = %d\n", var1); }

int main() {
  void (*ptr_method)(int);
  ptr_method = display;

  ptr_method(54);

  return 0;
}

Producción :

The variable holds value = 54

Proporcione un método de la misma clase que el puntero de función en C++

El programa utilizado en este ejemplo es similar a los otros dos programas. Pero aquí, el puntero es un método, mientras que en los otros dos programas el trabajo fue manejado por simples variables de puntero.

Se crea una clase constructora assgnPtr con dos miembros públicos: un método char foo y otro método char que es un puntero de función ptr. Los dos métodos se muestran en la siguiente sintaxis, y está claro en la última línea de la sintaxis que apunta a la clase assgnPtr para el puntero de función.

public:
char foo();
char (assgnPtr::*ptr)();

Después de declarar los métodos públicos, a la función foo() se le proporciona un retorno f. Esto implica que cuando se llama al puntero de función, el programa llama a la función foo e imprime lo que se devuelve.

Una variable llamada var1 se declara dentro del método principal. Esta variable funciona como un objeto de clase.

Esto se debe a que los punteros de función que son funciones miembro tienen el inconveniente de ser inaccesibles cuando se usan sin un objeto de la misma clase. La función miembro se asigna a la variable de puntero en la siguiente sintaxis.

int main() {
  assgnPtr var1;
  var1.ptr = &assgnPtr::foo;

El puntero ptr se usa junto con la clase de objeto var1, y se le asigna el método foo. Como constructor, el método tiene que ser asignado usando el símbolo ::, indicando que la función es el método miembro de la clase assgnPrt.

Por último, se debe imprimir el resultado.

printf("%c\n", (var1.*(var1.ptr))());

Puede ser preocupante para los lectores, ya que es muy complicado de entender. Por lo tanto, debe dividirse en bits para comprenderlo claramente.

var1.ptr es un puntero a la función miembro de la clase assgnPtr. Pero cuando se usa *(var1.ptr), se convierte en una referencia de puntero mientras que la impresión de *(var1.ptr) no se puede usar directamente ya que ptr no está dentro del alcance.

Por esa razón, debe vincularse con el objeto de clase var1 como var1.*(var1.ptr).

Por último, (var1.*(var1.ptr))() invoca el método sin argumentos. La declaración de impresión imprime el valor devuelto cuando se llama al método utilizando el puntero de función.

Código fuente completo:

#include <iostream>

class assgnPtr {
 public:
  char foo();
  char (assgnPtr::*ptr)();
};

char assgnPtr::foo() { return 'f'; }

int main() {
  assgnPtr var1;
  var1.ptr = &assgnPtr::foo;
  printf("%c\n", (var1.*(var1.ptr))());
}

Producción :

f

Puntero de función a función miembro usando comando de cadena en C++

En este ejemplo, el programa usa comandos de cadena para asignar punteros de función. El concepto central es similar, excepto que el método miembro usa un operador relacional para verificar y asignar el puntero.

El programa utiliza dos funciones de importación, iostream para i/o y string para comandos de cadena. Se crea una clase constructora assgnPtr2.

Hay dos miembros privados, display y pass_value y un miembro público, func_ptr, que será el puntero de función.

El miembro privado pass_value tiene tres parámetros: variables x e y de cadena de tipo de datos y un prototipo de función foo. El prototipo de función establece que el parámetro foo será un puntero a una función.

El método display imprimirá una declaración cuando se asigne el puntero. El método func_ptr llama al método pass_value y pasa los valores de x e y como parámetro, y adjunta el método display usando el símbolo & como argumento para el prototipo de función.

Por último, dentro del método pass_value, los valores de x e y que se pasaron se comparan mediante el operador relacional ==. Una instrucción if asigna el puntero foo al método si los valores de x e y coinciden.

Dentro de la función principal, se crea un objeto de clase var. Usando este objeto, se llama al método func_ptr.

Código fuente completo:

#include <iostream>
#include <string>

class assgnPtr2 {
 public:
  void func_ptr();

 private:
  void display();
  void pass_value(std::string x, std::string y, void (assgnPtr2::*foo)());
};

void assgnPtr2::display() { std::cout << "Pointer Assigned\n"; }

void assgnPtr2::func_ptr() { pass_value("h", "h", &assgnPtr2::display); }

void assgnPtr2::pass_value(std::string x, std::string y,
                           void (assgnPtr2::*foo)()) {
  if (x == y) {
    (this->*foo)();
  }
}

int main() {
  assgnPtr2 var;
  var.func_ptr();
  return 0;
}

Producción :

Pointer Assigned

Artículo relacionado - C++ Pointer