Id. de artículo: 94579 - Última revisión: jueves, 11 de diciembre de 2003 - Versión: 2.0

INFORMACIÓN: Crear un puntero de función a una función miembro de C++

En esta página

Expandir todo | Contraer todo

Resumen

El texto siguiente describe la generación de un puntero a función para una función miembro de clase en código compilado con Microsoft C/C ++ versión 7.0 o posterior. La declaración de un puntero a una función miembro de clase debe incluir el nombre de la clase. Sin embargo, el nombre de clase, se omite de la declaración de un puntero a una función miembro estática.

Más información

En los lenguajes C y C++, una aplicación puede definir una variable que contiene la dirección de una función. Se puede llamar a la función utilizando esta variable en lugar de mediante el nombre de función. En C++, un puntero a una función miembro no estático contiene la dirección de la función de la clase, no en el objeto. Para llamar a la función, utilice el operador de selección de miembro correspondiente (. o->), el operador de direccionamiento indirecto (*) y el nombre de un objeto de la clase.

En la mayoría de los casos en el lenguaje C, las declaraciones de puntero de función toman la forma siguiente:
   int (*ptr)();
				
este código declara un puntero a una función que devuelve un entero. La función acepta un número desconocido de aumenta. Para crear un puntero a una función miembro de clase de C++, especifique el nombre de la clase en la declaración de puntero de función, como sigue:
   int (Sample::*ptr)();
				
este código declara un puntero a una función miembro en la clase de ejemplo que devuelve un entero. Esta función no acepta argumentos.

Las maneras de interpretar los paréntesis vacíos en las declaraciones de función es una diferencia principal entre los lenguajes C y C++. En C, una declaración de puntero de función que no tiene argumentos es sintácticamente idéntica a la siguiente:
   int (*ptr)(...);
				
sin embargo, un prototipo de C++ declaradas sin argumentos es sintácticamente idéntico a la siguiente:
   int (Sample::*ptr)(void);
				
en C++, si la función acepta argumentos, tipos de los argumentos también deben aparecer, como en el siguiente:
   int (Sample::*ptr2)(int, int);
				
en C, tipos de los argumentos pueden aparecer en la misma manera. Un puntero a una función miembro estática se declara en la misma manera que un puntero a una función de C. Sin embargo, debido a que la declaración forma parte de un programa de C++, la declaración debe lista argumentos y sus tipos asociados.

Para determinar la dirección de procedimiento para asignar a una variable de puntero, utilice el nombre de clase y el operador de resolución de ámbito (::). Esta sintaxis proporciona flexibilidad porque una variable declarada puede contener la dirección de cualquier objeto de la clase. El nombre del objeto en la llamada de función determina la copia de la función utilizada.

El código de ejemplo siguiente muestra punteros de declarar y utilizas una función miembro de clase a una función miembro estática. Tenga en cuenta que cuando los argumentos de la declaración de puntero de función no coinciden con los argumentos de la función asignada al puntero, el compilador genera errores C2440 y C2564. Por ejemplo, si se omite la declaración "int" en la declaración de lista de argumento para el puntero de función, el compilador genera los mensajes de error siguientes:

16-bit

el error C2440: 'inicialización': no se puede convertir de ' void (__pascal __far datos:: *) (int) __near 'a' void (__pascal __far datos:: *) (void) __near '

Error C2564: parámetros formales y reales no coinciden en la llamada a través del puntero a función

32 bits

el error C2440: 'inicialización': no se puede convertir de ' void (Data::*)(int) a ' void (Data::*)(void)"

Error C2197: ' void (Data::*)(void) ': hay demasiados parámetros reales

Código de ejemplo

/*
 * Compile options needed: None
 */ 

#include <iostream.h>

class Data
{
private:
   int y;
   static int x;

public:
   void SetData(int value) {y = value; return;};
   int GetData() {return y;};
   static void SSetData(int value) {x = value; return;};
   static int SGetData() {return x;};
};

int Data::x = 0;

void main(void)
{
   Data mydata, mydata2;

   // Initialize pointer.
   void (Data::*pmfnP)(int) = &Data::SetData; // mydata.SetData;

   // Initialize static pointer.
   void (*psfnP)(int) = &Data::SSetData;

   mydata.SetData(5); // Set initial value for private data.
   cout << "mydata.data = " << mydata.GetData() << endl;

   (mydata.*pmfnP)(20); // Call member function through pointer.
   cout << "mydata.data = " << mydata.GetData() << endl;

   (mydata2.*pmfnP)(10) ; // Call member function through pointer.
   cout << "mydata2.data = " << mydata2.GetData() << endl;

   (*psfnP)(30) ; // Call static member function through pointer.
   cout << "static data = " << Data::SGetData() << endl ;
}
				
Para obtener más información acerca de las listas de parámetro en las declaraciones de función y cómo éstos se controlan por C y C++, consulte en contacto con el siguiente artículo en Microsoft Knowledge Base:
79845  (http://support.microsoft.com/kb/79845/EN-US/ ) INFORMACIÓN: No se admiten declaraciones de estilo (K & R) anterior en C++

La información de este artículo se refiere a:
  • Microsoft Visual C++ 1.0 Professional Edition
  • Microsoft Visual C++ 1.5 Professional Edition
  • Microsoft Visual C++ 1.51
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional
Palabras clave: 
kbmt kbinfo kblangcpp KB94579 KbMtes
Traducción automáticaTraducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 94579  (http://support.microsoft.com/kb/94579/en-us/ )
Retired KB ArticleRenuncia a responsabilidad de los contenidos de la KB sobre productos a los que ya no se ofrece asistencia alguna
El presente artículo se escribió para productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.
 

Seleccione idioma