Допустим, у меня есть следующий дизайн библиотеки: Мы предоставляем класс A
для пользователей библиотеки, но не класс B
. Однако класс A
создает экземпляры класса B
для внутреннего потребления. Существуют требования к реализации, согласно которым A
должен генерировать экземпляры B
с использованием закрытой функции (т. Е. A::getOneB()
). Кроме того, сгенерированный экземпляр должен быть заключен в интеллектуальный указатель для безопасного управления памятью.
Так что вопрос: A.hpp должен включать B.hpp , чтобы Тип возвращаемого значения A::getOneB
может быть создан, но это приведет к утечке определения B
клиентам, которые включают A.hpp . Как мы можем предотвратить это?
A.hpp // мы экспортируем это для клиентского кода для использования A :: foo ().
#include "B.hpp"
class A {
public:
void foo(); // the public API
private:
std::unique_ptr<B> getOneB(); // the internal API that returns a fresh B to consume. We need smart pointer for auto memory management.
};
B.hpp // мы не экспортируем это, мы не хотим, чтобы код клиента знал о B.
class B {
};