Нарушение зависимостей модулей c 20

#c

Вопрос:

Я экспериментировал с модулями c 20

Я пытаюсь использовать идиому «виртуальный конструктор», т. Е. Сделать следующее

 class Base{
public:
  virtual ~Interface() = defau<
  virtual void DoStuff() = 0;
  static std::unique_ptr<Base> Create();
}

class Impl : public Base{
public:
  void DoStuff() override;
}

std::unique_ptr<Base> Base::Create(){
  return std::make_unique<Impl>();
}
 

Без модулей я могу разместить объявления базы в base.h, объявление Impl в impl.h, таким образом, клиенты не видят класс Impl, и оба impl.cpp и base.cpp может компилироваться.

Я знаю, что с модулями можно хранить все в одном модуле и просто не экспортировать класс Impl. Но предположим, что у нас много разных классов реализаций, и каждый из них большой и имеет свои собственные зависимости, в этом случае я хотел бы разместить интерфейс и внедрить в разные модули — для лучшей структуры и удобочитаемости, а также для изоляции зависимостей.

Но с модулями и разделом модулей это кажется невозможным, потому что раздел :база должен импортировать :impl (для работы виртуального конструктора), а раздел impl должен импортировать :база, чтобы иметь возможность выводить из базы.

Что я делаю не так? Или, может быть, я просто мыслю старыми терминами, и решение с 1 большим модулем идеально подходит? (Другим возможным решением было бы использовать обычную функцию вместо статического метода).

Комментарии:

1. Вы уверены, что это хороший пример? Я имею в виду, Create() не может быть static и не может быть реализовано Base . На самом деле это должно быть чисто виртуальным в Base

2. Можем ли мы получить полный пример на основе заголовка?

3. Какой модуль import не export редактируется, если вы не используете export import moduleImpl;