Domanda

in C ++, che può facilmente creare un puntatore a funzione prendendo l'indirizzo di una funzione membro. Tuttavia, è possibile modificare l'indirizzo di quella funzione locale?

vale a dire. dire che ho funcA () e funcB () nella stessa classe, definito in modo diverso. Sto cercando di cambiare l'indirizzo del funcA () a quello di funcB (), in modo tale che in fase di esecuzione chiamando funcA () in realtà si traduce in una chiamata a funcB (). So che questo è brutto, ma ho bisogno di fare questo, grazie!

Modifica ----------

Sfondo su quello che sto cercando di fare:

Spero di implementare test di unità per una base di codice esistente, alcuni dei metodi della classe base che tutti i miei moduli sono eredita da sono non-virtuale. Non mi è permesso di modificare qualsiasi codice di produzione. Posso giocherellare con il processo di generazione e sostituto in una classe base con i relativi metodi impostati su virtuale, ma ho pensato che preferisco usare un hack come questo (che ho pensato che fosse possibile).

Inoltre, mi interessa l'argomento per curiosità tecnica, che attraverso il processo di cercare di incidere a questo problema che sto imparando un po 'su come le cose, come la generazione del codice e il lavoro di look-up funzione sotto la cappuccio, che non ho avuto la possibilità di imparare a scuola avendo appena finito 2 ° anno di università. Non sono sicuro quanto a sarò mai insegnato queste cose a scuola come io sono in un programma di ingegneria informatica, piuttosto che CS.

Torna in tema Il metodo funcA () e funcB () effettivamente hanno la stessa firma, quindi il problema è che posso solo ottenere l'indirizzo di una funzione utilizzando l'operatore &? Sarei ragione nel dire che non posso cambiare l'indirizzo della funzione, o scambiare i contenuti a quell'indirizzo senza danneggiare parti della memoria? Sarebbe iniezione DLL essere un approccio buono per una situazione come questa, se le funzioni sono esportati in una dll?

È stato utile?

Soluzione

No. Le funzioni sono compilati nel file eseguibile, e il loro indirizzo è fissato per tutta la durata di vita del programma.

La cosa più vicina è funzioni virtuali. Dacci un esempio di ciò che si sta cercando di realizzare, prometto che c'è un modo migliore.

Altri suggerimenti

Non può essere fatto nel modo che descriverlo. L'unico modo per modificare la destinazione di una chiamata staticamente legato è modificando il codice vero e proprio eseguibile del programma. C ++ linguaggio non ha caratteristiche che potrebbero realizzare questo.

Se si desidera che le chiamate di funzione da risolvere in fase di esecuzione è necessario sia per uso esplicitamente chiamate indirette (chiamate tramite puntatori a funzione), o caratteristiche del linguaggio di uso che si basano sulla risoluzione chiamata run-time (come funzioni virtuali), o è possibile utilizzare ramificazione pianura con buon vecchio if o switch. Che è più appropriato nel tuo caso dipende dal vostro problema specifico.

Tecnicamente potrebbe essere possibile per le funzioni virtuali modificando il vtable del tipo, ma certamente non può farlo senza violare lo standard (che causa un comportamento indefinito) e richiederebbe la conoscenza di come la vostra specifiche maniglie compilatore VTables.

Per le altre funzioni che non è possibile perché gli indirizzi delle funzioni sono direttamente scritti codice del programma, che è generalmente in un'area di memoria di sola lettura.

Quello che vogliamo è un puntatore ad una funzione, si può puntare a FuncA o FuncB assumendo che hanno la stessa firma.

Sono abbastanza sicuro che questo è impossibile in puro C ++. C ++ non è un linguaggio dinamico.

Non si può fare ciò che si vuole fare direttamente. Tuttavia, è possibile ottenere un risultato simile con alcuni criteri leggermente diversi, utilizzando qualcosa che si ha già familiarità con - puntatori a funzione. Prendere in considerazione:

// This type could be whatever you need, including a member function pointer type.
typedef void (*FunctionPointer)();

struct T {
   FunctionPointer Function;
};

Ora è possibile impostare il membro Function in un dato esempio T, e chiamarlo. Questo è quanto di più vicino si può ragionevolmente ottenere, e presumo che da quando si è già a conoscenza di puntatori a funzione si è già a conoscenza di questa soluzione.

Perché non modificare la tua domanda con una descrizione più completa del problema che si sta cercando di risolvere? Così com'è suona davvero come si sta cercando di fare qualcosa di orribile.

La sua semplice!

Per

  

in fase di esecuzione chiamando funcA () in realtà si traduce in una chiamata a funcB ().

funcA() scrittura simile al seguente:

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

: -)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top