Скрытие библиотечных зависимостей с помощью Pimpl, похоже, ничего не делает - PullRequest
1 голос
/ 06 августа 2020

Я использую PIMPL, чтобы скрыть детали реализации моей библиотеки от конечного пользователя. Также хочу захватить все сторонние зависимости библиотеки внутри себя; так что мне не нужно, чтобы конечный пользователь связывал их для использования моей библиотеки.

Интерфейс

//// core.h (the interface)
namespace N
{
    enum class priority { ... };
    enum class type { ... }
    class event_base { 
        ... // getting queued time, priority, name, type etc;
        private:
            priority m_priority;
            type m_type;
        
    };
    typedef std::shared_ptr<event_base> p_evt;
    
    class server_backend
    {
        public:
            server_backend(const uint32_t &port = 10100);
            ~server_backend();
            
            bool try_push(p_evt p);
            
            size_t get_size_evt_bus();
            
            void dump_evt_bus();
        
        private:
            struct impl;
            std::unique_ptr<impl> p_impl;
    }
}

Детали реализации

//// core.cpp
#include "backend.h"
using namespace N;
class server_backend::impl
{
    impl(const uint32_t& port)
        :_bimpl(std::make_unique<backendimpl>(port))
    {}
    
    bool try_push(p_evt p)
    {
        return true;
    }
    
    size_t get_size_evt_bus()
    {
        return 0;
    }
    
    void dump_evt_bus()
    { }

    private:
        std::unique_ptr<backendimpl> _bimpl;

}

server_backend::server_backend()
    :p_impl(std::make_unique<impl>(port))
{}

server_backend::~server_backend() = default;

/// call impl functions from server_backend public functions

Моя реализация создает экземпляр класса глубже в библиотеке. Этот класс действительно содержит типы данных из сторонних библиотек.

//backend.h
class backendimpl final
{
    backend(const uint32_t &port);
    
    ~backendimpl();
    
    bool try_push(p_evt p);
            
    size_t get_size_evt_bus();
            
    void dump_evt_bus();
    
  
    // other public functions
    
    private:
    // private members (some from 3rd party libs)
    
    // private functions
}

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

Кто-нибудь может помочь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...