Hago un uso regular de las declaraciones de clases avanzadas y punteros a dichas clases.Cualquier forma en C++ para reenviar declarar un prototipo de función?
Ahora tengo la necesidad de pasar un puntero a través de varias capas. Preferiría incluir el encabezado que declara el prototipo de mi puntero de función solo en el módulo que desreferencia un puntero de función en lugar de en cada capa que simplemente pasa a lo largo de ese valor de puntero.
¿Esto es posible?
=====
De las respuestas que sospecho que no me he expresado con suficiente claridad por la pregunta. Busco un análogo a una declaración de clase forward. Todos estamos de acuerdo en que puedo escribir:
class foo;
void bar (foo *);
void waz (foo * p) {bar (p); }
Observe que waz no sabe nada acerca de la clase foo aparte de su nombre. Quizás bar tendrá acceso a la descripción completa de foo. Quizás bar simplemente pase p más adelante. ¿A quien le importa? Solo aquellos sitios que eliminan la referencia de un foo *. Todos los demás sitios solo necesitan "clase foo".
mismo modo que sé que puedo escribir:
typedef void foo (int, double);
void bar (foo *);
void waz (foo * p) {bar (p); }
La diferencia es que ahora el identificador foo no solo es conocido por denotar un tipo de función, sino que además lleva la firma/prototipo completo. Esto me obliga a uno de los dos escenarios desagradables:
1) clonar typedef en varios sitios (yuck! Fragile!) 2) pegar el typedef en un encabezado e incluirlo en todas partes donde se menciona un foo *.
Observe la asimetría: en el caso de un objeto de datos, solo necesitaba proporcionar una descripción completa de la clase foo en esos puntos en los que quiero desreferenciar un foo *; en el caso de una función, necesito proporcionar la firma/prototipo completo donde quiera mencionar un foo *.
¿Hay alguna forma de remediar esta asimetría?
No hay asimetría. Puede reenviar declarar una clase y una función, no un typedef. Un typedef es solo un alias, ya no existe en el momento del enlace, por lo que no hay nada que enviar declarar al respecto. –
Tu argumento es falaz. Sí, si se usa, una función debe existir en el momento del enlace o si recibe un error de símbolo indefinido. OTOH una clase declarada avanzada no lo hace. Las instancias de dicha clase pueden existir, pero no son lo que denota un nombre de clase declarado adelante. Un nombre de clase declarado adelante denota una clase, no un objeto que ocupa almacenamiento. –
"_ Un nombre de clase declarado hacia adelante denota un ** [tipo] **, no un objeto que ocupa almacenamiento._" Al igual que un puntero a función denota un ** tipo **, no una función que ocupa instrucciones (y un punto de entrada) en el programa. Mi punto es que no se trata de 'typedef'; eso es irrelevante –