O que é técnica esta ++ C para a adição de tipos para uma classe chamada?
-
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.
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.