Apontando a uma variável de uma função de membro em c ++

É surpreendente descobrir que a maioria dos programadores C ++ têm idéia de que um ponteiro chamado esta

existe. assim esta é um grande segredo! Deleite-se com ele! Qual é o segredo? O segredo é que você pode obter o endereço de função membro de um objeto para que você possa acessar os dados de instância função membro diretamente. Ooh-wee!

Agora, lembre-se que cada instância de uma classe obtém sua própria cópia das variáveis ​​de membro, a menos que as variáveis ​​são estáticos. Mas as funções são compartilhados por toda a classe. Sim, você pode distinguir funções estáticas de funções nonstatic.

Mas isso só se refere ao que tipos de variáveis ​​que acessar: funções estáticas podem acessar variáveis ​​de membro única estáticos, e você não precisa se referir a eles com uma instância. Não estático (isto é, normal, normal) funções trabalhar com uma instância específica. No entanto, dentro da memória, realmente apenas uma cópia da função existe.

Então como é que a função de membro sabe qual instância de trabalhar? Um parâmetro segredo é passado para a função de membro: o esta ponteiro. Suponha que você tenha uma classe chamada Gobstopper que tem uma função de membro chamada Mastigar(). Em seguida, você tem uma instância chamada MyGum, e você chamar o Mastigar() função assim:

MyGum.Chew () -

Quando o compilador gera código de montagem para isso, ele realmente passa um parâmetro para a função - o endereço do MyGum exemplo, também conhecido como o thispointer. Portanto, apenas um Mastigar() função é no código, mas chamá-lo você deve usar uma instância específica da classe.

Video: Grings - Domínio e Imagem de funções de uma variável - Aula 3

Porque apenas uma cópia do Mastigar() função é na memória, você pode tomar seu endereço. Mas, para isso requer algum tipo de código enigmática para o futuro. Aqui está ele, rápido e direto ao ponto. Suponha que sua classe se parece com isso:

classe Gobstopper {public: int WhichGobstopper-int Chew (string name) {cout lt; lt; WhichGobstopper lt; lt; endl-cout lt; lt; nome lt; lt; endl-retorno WhichGobstopper -}} -

o Mastigar() função toma uma string e retorna um inteiro. Aqui está um typedef para um apontador para o Mastigar() função:

typedef int (Gobstopper :: * GobMember) (string) -

E aqui está uma variável do tipo GobMember:

Video: Grings - Introdução às funções de uma variável - Aula 1



GobMember func = &Gobstopper :: Chew-

Se você olhar atentamente para a typedef, parece semelhante a um ponteiro de função regular. A única diferença é que o nome de classe e dois dois pontos preceder o asterisco. Fora isso, é um ponteiro normal função antiga.

Video: Exemplo de resolução em função de uma variável

Mas, enquanto um ponteiro de função regular é limitado a apontar para funções de um determinado conjunto de tipos de parâmetros e um tipo de retorno, esta função de ponteiro ações essas restrições, mas tem uma limitação adicional: Ele só pode apontar para funções membro dentro da classe Gobstopper.

Para chamar a função armazenado no ponteiro, você precisa ter uma instância particular. Observe que, na atribuição de func no código anterior não havia exemplo, apenas o nome da classe e função, &Gobstopper :: Chew. Então, para chamar a função, pegar um exemplo, adicionar func, e ir!

o FunctionPointer02 exemplo mostrado contém um exemplo completo com a classe, o endereço de função de membro, e duas instâncias separadas.

#incluir #incluir usando Gobstopper namespace std-classe {public: int WhichGobstopper-int Chew (string name) {cout lt; lt; WhichGobstopper lt; lt; endl-cout lt; lt; nome lt; lt; WhichGobstopper endl-retorno -}} - int main () {typedef int (Gobstopper :: * GobMember) (string) -GobMember func = &Gobstopper :: Chew-gobstopper inst-inst.WhichGobstopper = 10-gobstopper outro another.WhichGobstopper-= 20- (inst. * Func) ("Greg W.") -. (Outro * func) ("Jennifer W.") 0-} -Retornar

Você pode ver na a Principal que primeiro você criar o tipo para a função, o que você chama GobMember, em seguida, criar uma variável, func, desse tipo. Em seguida, você cria duas instâncias do Gobstopper classe, e dar-lhes cada um diferente WhichGobstopper valor.

Video: C++ - Aula 08 - Invertendo valores de variáveis

Finalmente, você chamar a função de membro, em primeiro lugar para a primeira instância e, em seguida, para a segunda instância. Só para mostrar que você pode tirar os endereços das funções com parâmetros, você passar uma cadeia com alguns nomes.

Quando você executar o código, você pode ver a partir da saída que é realmente chamar a função de membro correto para cada situação:

10Greg W.20Jennifer W.

Agora, quando você diz “a função de membro correto para cada caso,” o que você realmente significa é que o código está chamando a mesma função de membro de cada vez, mas usando um exemplo diferente. Se você está pensando em termos de orientação a objetos, considere cada instância como tendo a sua própria cópia da função de membro. Portanto, não há problema em dizer “a função de membro correto para cada caso.”


Publicações relacionadas