我最近一直在试验 MSVC 提供的模块实现,我遇到了一个有趣的场景。我有两个类在它们的接口中相互依赖,这意味着我必须使用前向声明来编译它。以下代码显示了一个示例:
Module interface
export module FooBar;
export namespace FooBar {
class Bar;
class Foo {
public:
Bar createBar();
};
class Bar {
public:
Foo createFoo();
};
}
Module implementation
module FooBar;
namespace FooBar {
Bar Foo::createBar() {
return Bar();
}
Foo Bar::createFoo() {
return Foo();
}
}
现在我想将这两个类拆分为它们自己的名为Foo
和的模块Bar
。但是,每个模块都需要导入另一个,因为它们的接口相互依赖。根据目前的模块提案,不允许循环接口导入。本文建议使用proclaimed ownership
声明,但似乎尚未在模块的 MSVC 实现中实现。
因此,我是否正确假设目前无法使用 MSVC 提供的当前实现来解决这种情况?还是有一些我想念的替代品?在这种情况下,情况非常简单,但是我在模块化具有许多具有此类依赖关系的类的库时遇到了这个问题。我意识到循环依赖通常表明设计不好,但是在某些情况下,它们是不可避免的或难以重构的。