【发布时间】:2010-01-26 22:55:37
【问题描述】:
这更像是一个最佳实践问题,而不是一个语言问题,因为我已经有了一个可行的解决方案来解决 C++ 中常见的绊脚石。
我正在处理模板参数替换中的典型循环依赖问题。我有以下一对类:
template<class X>
class A { /* ... */ };
template<class X>
class B { /* ... */ };
我想将每一个实例化如下:
// Pseudocode -- not valid C++.
A<B> a;
B<A> b;
也就是说,我想将 A 绑定到 B,并将 B 绑定到 A。
我可以通过带有继承技巧的前向声明以粗略的方式解决问题:
class sA;
class sB;
class sA : public A<sB> { /* ... */ };
class sB : public B<sA> { /* ... */ };
但这带来了一系列问题,因为sA 和sB 确实不是A 和B。例如,如果不将A 的构造函数正确复制到sA 中,或者在代码周围以某种方式闪闪发光,我就无法调用它们。
我的问题是:处理这个问题的最佳实用方法是什么?这个问题有什么特别聪明的解决方案吗?
我同时使用 MSVC2008 和 G++,但欢迎使用具有编译器特定扩展的解决方案。
谢谢,
阿列克
【问题讨论】:
-
我会对需要的实际示例感兴趣,在我看来,循环类型依赖首先不应该存在。
-
gf,假设A类是服务器类,B类是客户端类,两者都符合标准协议,这样可能会有一组其他客户端/服务器类可以连接一起。例如,B 从 A 查询数据,A 向 B 发送事件。它们每个都有一个指向另一个的指针(例如,A 包含一个 B*,B 包含一个 A*),它们通过调用每个上的预定义方法进行通信其他。这就是它的使用方式,尽管存在这个问题,它仍然运行良好。我希望这会使案件更清楚。也欢迎对上述设计提出建议。谢谢
-
你需要重构。分解出通用的通信接口。
-
其次,你应该至少在一侧打破类型依赖。
标签: c++ templates coding-style circular-dependency