Определение класса A требует определения класса B, как я могу представить публичные c функции A без предоставления определения B? - PullRequest
1 голос
/ 03 февраля 2020

Допустим, у меня есть следующий дизайн библиотеки: Мы предоставляем класс 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 {
};

1 Ответ

2 голосов
/ 03 февраля 2020

Для определения класса A требуется определение класса B, как мне представить публичные c функции A, не раскрывая определения B?

Если определение B необходимо, то вы не можете избежать воздействия из определения Б. Таким образом, решение состоит в том, чтобы изменить предпосылку: Измените A так, чтобы его определение больше не зависело от определения B.

В этом случае просто замените функцию-член свободной функцией, которая не требуется объявлено в заголовке, который определяет A.

Другой подход заключается во введении непрозрачного класса-оболочки:

struct BWrapper;
class A {
    BWrapper getOneB();
};

// outside the header;
#include "B.hpp"
struct BWrapper {
    std::unique_ptr<B> b_ptr;
};
BWrapper A::getOneB() {
   ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...