O que é técnica esta ++ C para a adição de tipos para uma classe chamada?

StackOverflow https://stackoverflow.com/questions/1643197

  •  10-07-2019
  •  | 
  •  

Pergunta

Eu apenas encontrei algum código C ++ (em http://msdn.microsoft.com/en-us/library/k8336763(VS.71).aspx ), que usa uma técnica que eu nunca vi antes de adicionar tipos para uma classe existente:

class Testpm {
public:
   void m_func1() { cout << "m_func1\n"; }
   int m_num;
};

// Define derived types pmfn and pmd.
// These types are pointers to members m_func1() and m_num, respectively.
void (Testpm::*pmfn)() = &Testpm::m_func1;
int Testpm::*pmd = &Testpm::m_num;

int main() {
   Testpm ATestpm;
   Testpm *pTestpm = new Testpm;

   // Access the member function
   (ATestpm.*pmfn)();
   (pTestpm->*pmfn)();   // Parentheses required since * binds

   // Access the member data
   ATestpm.*pmd = 1;
   pTestpm->*pmd = 2;

   cout  << ATestpm.*pmd << endl
         << pTestpm->*pmd << endl;
}

Alguém por favor pode me dizer o que esta técnica para definir tipos derivados é chamado, ou me aponte para alguma documentação sobre isso? Eu nunca se deparar com ela em 13 anos de usar C ++, e gostaria de terminar a minha ignorância.

Foi útil?

Solução

O comentário está incorreto: pmfn e PMD não são "tipos derivado" em tudo (eles não são mesmo tipos!). Eles são ponteiros para membros .

Outras dicas

Eu não acho que eles são "acrescentando tipos" para a classe. Eles parecem ser apenas definir tipos de ponteiros para funções de membro e dados de membro da classe, e em seguida, usando aqueles para acessar a função de membro e membro de dados. Semelhante à forma como você declarar tipos de funções não-membro, mas que são membros da classe dos difere de sintaxe.

A partir deste site aqui

No que diz respeito a sua sintaxe, há dois diferentes tipos de ponteiros de função: Por um lado, há ponteiros para C funções normais ou para C ++ estático funções de membro. Por outro lado há ponteiros para C non-static ++ funções de membro. A diferença básica é que todos os ponteiros para não-estático funções de membro precisa de um escondido argumento: O presente-ponteiro para um instância da classe. Tenha sempre em mente: Estes dois tipos de função ponteiros são incompatíveis entre outra.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top