Pergunta

No C ++, posso criar um ponteiro de função facilmente, tomando o endereço de uma função de membro. No entanto, é possível alterar o endereço dessa função local?

Ou seja, diga que tenho funca () e funcb () na mesma classe, definido de maneira diferente. Estou procurando alterar o endereço do funca () para o do funcb (), de modo que no tempo de execução chamando funca () realmente resulta em uma chamada para funcb (). Eu sei que isso é feio, mas preciso fazer isso, obrigado!

EDITAR----------

Antecedentes sobre o que estou tentando fazer:

Espero implementar testes de unidade para uma base de código existente, alguns dos métodos da classe base dos meus módulos estão herdando não são virtuais. Não tenho permissão para editar nenhum código de produção. Posso mexer no processo de construção e substituir em uma classe base pelos métodos relevantes definidos como virtual, mas pensei em usar um hack como esse (o que eu pensei ser possível).

Além disso, estou interessado no tópico da curiosidade técnica, pois, através do processo de tentar invadir esse problema, estou aprendendo bastante sobre como coisas como geração de código e consulta de funções trabalham sob o capô, que Não tive a chance de aprender na escola ter terminado o 2º ano da universidade. Não tenho certeza de que jamais aprenderei essas coisas na escola, pois estou em um programa de engenharia de computadores em vez de CS.

De volta ao tópicoO método funca () e funcb () realmente têm a mesma assinatura, então o problema é que eu só posso obter o endereço de uma função usando o Operador? Eu estaria correto ao dizer que não posso alterar o endereço da função ou trocar o conteúdo nesse endereço sem corromper partes da memória? A injeção de DLL seria uma boa abordagem para uma situação como essa se as funções fossem exportadas para uma DLL?

Foi útil?

Solução

Não. As funções são compiladas no executável e seu endereço é corrigido durante toda a vida do programa.

A coisa mais próxima são as funções virtuais. Dê -nos um exemplo do que você está tentando realizar, prometo que há uma maneira melhor.

Outras dicas

Não pode ser feito da maneira que você o descreve. A única maneira de alterar o destino para uma chamada estaticamente vinculada é modificar o código executável real do seu programa. A linguagem C ++ não possui recursos que possam conseguir isso.

Se você deseja que as chamadas de função sejam resolvidas em tempo de execução, você deve usar chamadas explicitamente indiretas (chamadas por meio de ponteiros de função) ou os recursos de linguagem baseados na resolução de chamadas em tempo de execução (como funções virtuais) ou você pode usar ramificação simples com boa velha if ou switch. O que é mais apropriado no seu caso depende do seu problema específico.

Eu não encontrei a documentação Listando o código de erro 802. A página a seguir lista os códigos de erro 1, 800, 801 e 1. Eu não sei se a segunda entrada de 1 é um erro de digitação.Que pode ser o seu erro 802 ...

http://developer.android.com/reference/android/media/Mediarecorder.html

O que você deseja é um ponteiro para uma função, você pode apontar para Funca ou Funcb, assumindo que eles tenham a mesma assinatura.

Tenho certeza de que isso é impossível no puro C ++. C ++ não é uma linguagem dinâmica.

bytea será ideal para armazenar o hash.

será transferido em / sair do banco de dados como uma string hexadecimal de qualquer maneira, a menos que você use o protocolo de fio binário do PostgreSQL (suportado pela libpq e parcialmente por PGJDBC) para transferi-los.

Para melhores resultados, armazene como Bytea e faça com que o aplicativo cliente use uma chamada PQexecParams que solicite resultados binários.

Embora em reincestão, isso é confuso:

.

Para minha implementação, o hash nunca precisa deixar o banco de dados, mas os dados do Hashed devem ser comparados com dados externos para a existência freqüentemente

Você quer dizer que o hash não é transferido para comparação, os dados originais de texto acidentes são? Em caso afirmativo, o acima é irrelevante, já que o protocolo binário não oferece benefícios para dados de forma de texto.

Também: "dezenas de bilhões" de linhas é muito. PostgreSQL tem uma grande sobrecarga por uma linha por 28 bytes, então você vai estar perdendo muito espaço. Especialmente uma vez que você fita em despesas gerais de índice também. É postgresql a ferramenta certa para este trabalho?

Um pensamento final: com essas muitas linhas, você está se levantando em território de hash-colisão. Você se importa se é possível - embora improvável - por duas strings diferentes para ter o mesmo hash, então uma violação única incorreta é relatada? Se isso é um problema, então um índice de árvore B exclusivo no hash provavelmente não é a ferramenta certa para o trabalho.

É simples!

Por

no tempo de execução, chamando o funca () realmente resulta em uma chamada para funcb ().

Escreva funcA() Semelhante ao seguinte:

int funcA( int a, int b) {
  return funcB( a, b );
}

:-)

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