В последнее время я экспериментировал с реализацией модулей, предоставленных 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? Или есть какая-то альтернатива, которую мне не хватает? В этом сценарии ситуация довольно тривиальна, однако я столкнулся с этой проблемой при модульной библиотеке, которая имеет много классов, имеющих такие зависимости. Я понимаю, что циклические зависимости часто являются признаком плохого дизайна, однако в некоторых случаях они неизбежны или трудны для рефакторинга.
Задача ещё не решена.
Других решений пока нет …