Joh*_*tes 8 c++ forward-declaration function-prototypes
我经常使用前向类声明和指向这些类的指针.
我现在需要通过多个层传递函数指针.我更愿意将包含声明我的函数指针原型的头部包含在取消引用函数指针的模块中,而不是包含在简单地传递该指针值的每个层中.
这可能吗?
=====
从答复中我怀疑我没有明确地表达问题.我寻求类似于前瞻性声明.我们都同意我可以写:
foo;
void bar(foo*);
void waz(foo*p){bar(p); }
请注意,除了名称之外,waz对类foo一无所知.也许酒吧可以访问foo的完整描述.也许酒吧只会进一步传递.谁在乎?只有那些取消引用foo*的网站.所有其他网站只需要"class foo;".
同样地,我知道我可以写:
typedef void foo(int,double);
void bar(foo*);
void waz(foo*p){bar(p); }
不同之处在于,现在标识符foo不仅已知表示函数类型,而且还已经携带完整的签名/原型.这迫使我陷入两种不愉快的情景之一:
1)在多个站点克隆typedef(哎呀!脆弱!)2)将typedef粘贴在一个标题中,并将其包含在提到foo*的每个地方.
注意不对称:在数据对象的情况下,我只需要在我想要取消引用foo*的那些点上提供类foo的完整描述; 在函数的情况下,我需要提供完整的签名/原型,我想提到一个foo*.
那么无论如何要弥补这种不对称性?
您可以使用未定义的结构类型来执行此操作,但需要额外取消引用。
将其放入主头文件中:
typedef struct FuncStruct *FuncPtr;
Run Code Online (Sandbox Code Playgroud)
它声明struct FuncStruct但不声明任何字段,然后它声明一个指向该结构的指针,称为FuncPtr. 您可以传递FuncPtrs,但不能取消引用它们。
然后在特定文件(或更具体的 .h 文件)中,您实际上可以struct FuncStruct这样定义:
struct FuncStruct {
int (*f)(int, char, double);
};
Run Code Online (Sandbox Code Playgroud)
然后,超过此定义的代码可以取消引用 aFuncPtr以获取实际的函数指针。
请注意,这是来自强制转换的额外取消引用,这意味着您需要对FuncStructs 进行一些内存管理。