Is it possible to write an agile Pimpl in c++?

后端 未结 4 1507
無奈伤痛
無奈伤痛 2020-12-03 16:14

I\'ve been playing with the Pimpl idiom and reaping all sorts of benefits from it. The only thing I haven\'t been too keen on is the feeling I get when I define the function

4条回答
  •  醉话见心
    2020-12-03 16:31

    You might consider something along these lines:

    An Interface class to minimize repeating declarations. The client will use the PublicImplementation class in their code.

    Pimpl.h

    #ifndef PIMPL_H_
    #define PIMPL_H_
    
    #include  // std::unique_ptr
    
    class Interface
    {
    public:
        virtual ~Interface() {}
    
        virtual void func_a() = 0;
        virtual void func_b() = 0;
    };
    
    class PublicImplementation
    {
        // smart pointer provides exception safety
        std::unique_ptr impl;
    
    public:
        PublicImplementation();
    
        // pass-through invoker
        Interface* operator->() { return impl.get(); }
    };
    
    #endif // PIMPL_H_
    

    Pimpl.cpp

    #include "Pimpl.h"
    #include 
    
    class PrivateImplementation
    : public Interface
    {
    public:
    
        void func_a() override { std::cout << "a" << '\n'; }
        void func_b() override { std::cout << "b" << '\n'; }
    };
    
    PublicImplementation::PublicImplementation()
    : impl(new PrivateImplementation)
    {
    }
    

    And finally this is what the client code does:

    Main.cpp

    #include "Pimpl.h"
    
    int main()
    {
        PublicImplementation pi; // not a pointer
    
        pi->func_a(); // pointer semantics
        pi->func_b();
    }
    

提交回复
热议问题