funzione di membro privato che prende un puntatore a un membro privato nella stessa classe
-
19-09-2019 - |
Domanda
Come posso fare questo? (Il seguente codice non funziona, ma spero che spiega l'idea.)
class MyClass
{
....
private:
int ToBeCalled(int a, char* b);
typedef (MyClass::*FuncSig)(int a, char* b);
int Caller(FuncSig *func, char* some_string);
}
Voglio chiamare chiamante, in qualche modo, come:
Caller(ToBeCalled, "stuff")
e hanno Caller
chiamata ToBeCalled
con qualunque parametri si sente esigenze di passaggio. Se possibile voglio tenere tutto incapsulato nella parte privata della mia classe. In realtà, avrei circa 50 funzioni come ToBeCalled
, quindi non posso vedere un modo per evitare questo.
Grazie per eventuali suggerimenti. :)
Soluzione
Sei la maggior parte del tragitto. Ti stai perdendo il tipo restituito dalla typedef, dovrebbe essere
typedef int (MyClass::*FuncSig)(int, char*);
Ora, non vi resta che usarlo correttamente:
int Caller(FuncSig func, int a, char* some_string)
{
return (this->*func)(a, some_string);
}
Si vuole passare intorno casi FuncSig
semplici, non FuncSig*
- un FuncSig*
è un puntatore a un puntatore a una funzione membro, con un ulteriore livello di riferimento indiretto inutile. È quindi utilizzare l'operatore freccia stelle (non il suo nome ufficiale) per chiamarlo:
(object_to_be_called_on ->* func)(args);
Per gli oggetti non-puntatore (ad esempio gli oggetti nello stack, o riferimenti a oggetti), si utilizza l'operatore punto stelle:
MyClass x;
(x .* func)(args);
Inoltre, diffidare di precedenza degli operatori - gli operatori freccia stelle e dot-stelle hanno la precedenza inferiore rispetto chiamate di funzione, quindi è necessario mettere tra parentesi extra, come ho fatto in precedenza
.Altri suggerimenti
Sto assumendo si è tentato già Caller(MyClass::ToBeCalled, "stuff")
, ma c'è una ragione particolare è necessario un puntatore a funzione? Inoltre, si prega di inviare l'errore del compilatore vero e proprio.