我经常使用前向类声明和指向这些类的指针。
我现在需要通过多个层传递函数指针。我宁愿将声明我的函数指针原型的标头仅包含在取消引用函数指针的模块中,而不是包含在简单地传递该指针值的每个层中。
这可能吗?
=====
从回复中我怀疑我没有足够清楚地表达问题。我寻求类似于前向类声明的类比。我们都同意我可以写:
类 foo;
空栏(foo*);
无效 waz(foo* p) { bar(p); }
请注意,除了名称之外,waz 对 foo 类一无所知。也许 bar 可以访问 foo 的完整描述。也许 bar 会简单地将 p 传递得更远。谁在乎?只有那些取消引用 foo* 的网站。所有其他站点只需要“class foo;”。
同样,我知道我可以写:
typedef void foo(int, double);
空栏(foo*);
无效 waz(foo* p) { bar(p); }
不同之处在于,现在标识符 foo 不仅已知表示函数类型,而且还带有完整的签名/原型。这迫使我进入两种不愉快的情况之一:
1)在多个站点克隆 typedef(糟糕!脆弱!) 2)将 typedef 粘贴在标头中,并将其包含在提到 foo* 的任何地方。
注意不对称:在数据对象的情况下,我只需要在我想取消引用 foo* 的那些点提供类 foo 的完整描述;在函数的情况下,我需要在任何我想提到 foo* 的地方提供完整的签名/原型。
那么有没有办法弥补这种不对称性呢?