Help and Support

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

Traducción automáticamente
AVISO: Gracias por utilizar el servicio de Traducción Automática. Este artículo ha sido traducido por un sistema informático sin ayuda humana (Machine Translation). Microsoft ofrece estos artículos a los usuarios que no comprendan el inglés, exclusivamente, con el fin de que puedan entenderlos más fácilmente. Microsoft no se hace responsable de la calidad lingüística de las traducciones ni de la calidad técnica de los contenidos de los artículos así como tampoco de cualesquiera problemas, directos o indirectos, que pudieran surgir como consecuencia de su utilización por los lectores.
Haga clic aquí para ver el artículo original (en inglés): 94579 (http://support.microsoft.com/kb/94579/en-us/)
Id. de artículo:94579
Última revisión:jueves, 11 de diciembre de 2003
Versión:2.0
En esta página

Resumen

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

Volver al principio

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 que utiliza esta variable mediante el nombre de función. En C++, un puntero a una función miembro no estática contiene la dirección de la función en el class, no en el objeto. Para llamar a la función, utiliza 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 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 de que aumentan desconocido. Para crear un puntero a una función miembro de clase de C++, especifique el nombre de clase en la declaración de puntero de función de manera siguiente:
   int (Sample::*ptr)();
				
Este código declara un puntero a una función miembro de la clase de Ejemplo que devuelve un entero. Esta función no acepta ningún argumento.

El ways diferente que interpreta los paréntesis vacíos en 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 ningún argumento es sintácticamente idéntica a lo siguiente:
   int (*ptr)(...);
				
Sin embargo, un prototipo de C++ declarado sin argumentos es sintácticamente idéntico a lo siguiente:
   int (Sample::*ptr)(void);
				
En C++, si la función acepta argumentos, también los tipos de los argumentos deben aparecer como en lo siguiente:
   int (Sample::*ptr2)(int, int);
				
En C, los tipos de los argumentos se pueden enumerar de la misma manera. Un puntero a una función miembro estática se declara de la misma manera como un puntero a una función de C. Sin embargo, puesto que la declaración trata de parte de un programa de C++, la declaración debe mostrar ningún argumento y sus tipos asociados.

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

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

Volver al principio

16 bits

error : : ' void ( : * ) (int) ( : * ) (void) ' "inicializa" no se puede realizar la conversión __pascal __far Datos __near para anular __pascal __far Datos Error C2440

error : C2564 los parámetros formal/actual no coinciden en llamada a función a través de puntero

Volver al principio

32 bits

error : : ' void ( ' ) "inicializa" no se puede realizar la conversión Data::*)(int) para void ("Data::*)(void)") Error C2440

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

Volver al principio

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 más información acerca de listas de parámetros en declaraciones de función y cómo son controlados éstos por C y C++, consulte el artículo siguiente en el Microsoft Knowledge Base:
79845 (http://support.microsoft.com/kb/79845/EN-US/) INFO: No se admite declaraciones antiguas Estilo (K &amp; R) en C++

Volver al principio


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 Edition

Volver al principio

Palabras clave: 
kbinfo kblangcpp KB94579 KbMtes kbmt

Volver al principio

Seleccione idioma

 

Other Support Options

  • Contact Microsoft
    Phone Numbers, Support Options and Pricing, Online Help, and more.
  • Customer Service
    For non-technical assistance with product purchases, subscriptions, online services, events, training courses, corporate sales, piracy issues, and more.
  • Newsgroups
    Pose a question to other users. Discussion groups and Forums about specific Microsoft products, technologies, and services.