使用类模板的 C++ 循环依赖 - 如何重构?

标签 c++ templates circular-dependency extensible

我正在处理 C++ 中的循环依赖问题。

情况如下所示:

libA.so:
    - Body.cpp
    - Header.cpp
    - DataObject.cpp
    - DataObject::read(boost::asio::streambuf* data)
      {
          boost::asio::streambuf data;

          ....

          body = (new DataConverter<Body>)->convert(&data);
          header = (new DataConverter<Header>)->convert(&data);
      }

  libB.so:
      - DataConverter.cpp
          -> DataConverter<T>
          -> T* DataConverter<T>::convert(boost::asio::streambuf* data)

  libA.so <-> libB.so

存在循环依赖,因为 libA 使用来自 libB 的转换器类,而 libB 现在需要了解需要转换的 libA 的对象类型 - 因为 DataConverter::convert 返回一个 Body 或 Header 对象。

我想过用前向声明来解决这个问题——但这对我来说似乎不是最干净的解决方案。总而言之,我的计划是提供一个可扩展的 DataConverter 解决方案。

作为最佳实践,你们有什么建议?也欢迎完全不同的设计:)

最好的, 塞巴斯蒂安

最佳答案

如果您需要一个类模板DataConverter,那么它不能是任何已编译库的一部分。它必须通过包含文件可用。一旦您将 DataConverter 代码放入 header 中,由 libAlibB 使用,您的循环依赖性就会消失。

关于使用类模板的 C++ 循环依赖 - 如何重构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12226927/

相关文章:

c++ - 将库搜索路径添加到 clang

c++ - 使用像 emwin QT 这样的 c/c++ 制作的具有自定义 GUI 的 Flash android 平板电脑

c++ - 有没有办法解决这个模板循环依赖

javascript - 动态创建模板 - Meteor

javascript - 为什么我的算法显示 [循环]? (NodeJS简单算法)

c++ - 如何保证后声明的类的变量在前一个类中可见?

c++ - 如何设计嵌套类是同一类型的嵌套模板类

c++ - 我可以编写没有 header 的 C++ 代码(重复函数声明)吗?

c++ - C++ 中的自由定理 : are templates inherently ignorant and neutral with their objects of unknown types?

python - 动态更改 urwid.MainLoop 小部件的首选方法