#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;