Qub*_*ub1 9 c++ circular-dependency visual-c++ c++-modules
我最近一直在试验 MSVC 提供的模块实现,我遇到了一个有趣的场景。我有两个在它们的接口中相互依赖的类,这意味着我必须使用前向声明来编译它。以下代码显示了一个示例:
Module interface
export module FooBar;
export namespace FooBar {
class Bar;
class Foo {
public:
Bar createBar();
};
class Bar {
public:
Foo createFoo();
};
}
Run Code Online (Sandbox Code Playgroud)
Module implementation
module FooBar;
namespace FooBar {
Bar Foo::createBar() {
return Bar();
}
Foo Bar::createFoo() {
return Foo();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想将这两个类拆分为它们自己的名为Foo和的模块Bar。但是,每个模块都需要导入另一个模块,因为它们的接口相互依赖。根据目前的模块提案,不允许循环接口导入。这篇文章建议使用proclaimed ownership声明,但是在模块的MSVC实现中似乎还没有实现。
因此,我是否正确假设目前无法使用 MSVC 提供的当前实现解决这种情况?还是我缺少一些替代方案?在这种情况下,情况非常简单,但是我在模块化具有许多具有此类依赖关系的类的库时遇到了这个问题。我意识到循环依赖通常表明设计不佳,但在某些情况下,它们不可避免或难以重构。
您可以创建第三个模块,该模块仅将前向声明导出到每个类(可能是许多类)。
然后,将此模块导入到两个(或所有)模块中,其中它提供实现每个模块所需的前向声明。
不幸的是,MSVC 仍然存在模块问题(今天是版本 16.7);尽管这种方法有效,但您经常会收到完全疯狂的错误消息;例如,“无法将 MyClass* 转换为 MyClass* - 未提供转换(当您直接将同一类的前向声明添加到多个模块时,会发生此示例;编译器将它们视为不同的动物)。
另一个问题是,如果您忘记导入所有所需的模块,错误消息要么严重误导(“该类中没有这样的方法”),要么编译器因内部错误而中止。
在他们完成工作之前不要期望太多。
| 归档时间: |
|
| 查看次数: |
642 次 |
| 最近记录: |