INFO: Criando um ponteiro de função para uma função de membro C++

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 94579
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sumário
O texto abaixo descreve gerar um ponteiro de função para uma função de membro de classe no código compilado com o Microsoft C/C ++ versão 7.0 ou posterior. A declaração de um ponteiro para uma função de membro de classe deve incluir o nome de classe. No entanto, o nome da classe é omitido da declaração de um ponteiro para uma função de membro estático.
Mais Informações
Em linguagens C e C++, um aplicativo pode definir uma variável que contém o endereço de uma função. Você pode chamar a função usando essa variável em vez de por meio do nome da função. No C++, um ponteiro para uma função de membro nonstatic contém o endereço da função na classe, não no objeto. Para chamar a função, use o operador de seleção de membro (. ou->), o operador de indireção (1) e o nome de um objeto da classe.

Na maioria dos casos na linguagem C, declarações de ponteiro de função assumem a forma seguir:
   int (*ptr)();				
esse código declara um ponteiro para uma função que retorna um número inteiro. A função aceita um número desconhecido de augments. Para criar um ponteiro para uma função de membro de classe do C++, especifique o nome da classe na declaração do ponteiro de função, da seguinte maneira:
   int (Sample::*ptr)();				
esse código declara um ponteiro para uma função de membro na classe de exemplo que retorna um número inteiro. Esta função não aceita argumentos.

As diferentes maneiras de interpretar os parênteses vazios em declarações de função é uma grande diferença entre as linguagens C e C++. C, uma declaração de ponteiro de função que não possui argumentos é sintaticamente idêntica à seguinte:
   int (*ptr)(...);				
Contudo, um protótipo de C++ declarada sem argumentos é sintaticamente idêntico do seguinte:
   int (Sample::*ptr)(void);				
em C++, se a função aceita argumentos, os tipos dos argumentos devem também estar listados, como no exemplo a seguir:
   int (Sample::*ptr2)(int, int);				
em C, os tipos dos argumentos podem ser listados da mesma maneira. Um ponteiro para uma função de membro estático é declarado da mesma maneira como um ponteiro para uma função C. No entanto, como a declaração é parte de um programa C++, a declaração deve listar os argumentos e seus tipos associados.

Para determinar o endereço do procedimento para atribuir a uma variável de ponteiro, use o nome da classe e o operador de resolução escopo (::). Essa sintaxe fornece flexibilidade porque uma variável declarada pode conter o endereço de qualquer objeto da classe. O nome do objeto na chamada de função determina a cópia da função usada.

O exemplo de código abaixo demonstra declarativo e usando ponteiros para uma função de membro de classe e uma função de membro estático. Observe que, quando os argumentos na declaração de ponteiro de função não coincidem com os argumentos da função atribuída ao ponteiro, o compilador gera erros C2440 e C2564. Por exemplo, se a declaração "int" for omitida da declaração de lista a argumento para o ponteiro de função, o compilador gera as seguintes mensagens de erro:

16-bits

Erro C2440: 'Inicializar': não é possível converter ' void (__pascal __far dados:: *) (int) __near 'para' void (__pascal __far dados:: *) (void) __near '

Erro C2564: incompatibilidade de parâmetros formal/real no chamada através de ponteiro para função

32 bits

Erro C2440: 'Inicializar': não é possível converter ' void (Data::*)(int) para ' void (Data::*)(void)"

Erro C2197: ' void (Data::*)(void) ': número excessivo de parâmetros reais

Código de exemplo

/* * 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 obter mais informações sobre listas de parâmetro em declarações de função e como elas são manipuladas por C e C++, consulte o seguinte artigo na Base de dados de Conhecimento da Microsoft:
79845INFO: A antiga declaração de estilo (K & R) não é suportadas em C++
C2040

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 94579 - Última Revisão: 12/04/2015 09:21:38 - Revisão: 2.0

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

  • kbnosurvey kbarchive kbmt kbinfo kblangcpp KB94579 KbMtpt
Comentários