Faccio regolarmente uso di dichiarazioni di classe forward e puntatori a tali classi.Qualsiasi modo in C++ di inoltrare dichiara un prototipo di funzione?
Ora ho bisogno di passare un puntatore di funzione attraverso un numero di livelli. Preferirei includere l'intestazione che dichiara il prototipo del mio puntatore di funzione solo nel modulo che dereferisce un puntatore a funzione piuttosto che in ogni livello che passa semplicemente lungo quel valore di puntatore.
È possibile?
=====
Dalle risposte ho il sospetto che non ho espresso dalla domanda con sufficiente chiarezza. Cerco un analogo a una dichiarazione di classe avanzata. Siamo tutti d'accordo che posso scrivere:
classe foo;
void bar (foo *);
void waz (foo * p) {bar (p); }
Si noti che waz non sa nulla di classe foo diverso dal suo nome. Forse la bar avrà accesso alla descrizione completa di foo. Forse la barra passerà semplicemente p più avanti. Che importa? Solo quei siti che dereferiscono un foo *. Tutti gli altri siti hanno bisogno solo di "classe foo".
Allo stesso modo so che posso scrivere:
typedef void foo (int, double);
void bar (foo *);
void waz (foo * p) {bar (p); }
La differenza è che ora l'identificatore foo non solo è noto per denotare un tipo di funzione, ma inoltre porta già la firma completa/prototipo. Questo mi costringe in uno dei due spiacevoli scenari:
1) clonare il typedef su più siti (yuck! Fragile!) 2) incollare il typedef in un'intestazione e includerlo ovunque sia menzionato un foo *.
Nota l'asimmetria: nel caso di un oggetto di dati, dovevo solo fornire una descrizione completa della classe foo in quei punti in cui voglio dereferenziare un foo *; nel caso di una funzione ho bisogno di fornire la firma/prototipo completo ovunque io voglia menzionare un foo *.
Quindi c'è comunque da rimediare a questa asimmetria?
Non c'è asimmetria. È possibile inoltrare una classe e una funzione, non un typedef. Un typedef è solo un alias, non esiste più al momento del collegamento, quindi non c'è nulla da inoltrare per dichiararlo. –
La tua argomentazione è fallace. Sì, se utilizzato deve esistere una funzione al momento del collegamento o si ottiene un errore di simbolo non definito. OTOH una classe dichiarata in avanti non lo fa. Le istanze di tale classe possono esistere ma non sono ciò che un nome di classe dichiarato avanti indica. Un nome di classe dichiarato in avanti denota una classe, non un oggetto che occupa memoria. –
"_Un nome di classe dichiarato avanti denota un ** [tipo] **, non un oggetto che occupa memoria._" Proprio come un puntatore a funzione denota un ** tipo **, non una funzione che occupa istruzioni (e un punto di ingresso) in il programma. Il mio punto è che non si tratta del 'typedef'; questo è irrilevante. –