[HN Gopher] Implementing a class with void*
       ___________________________________________________________________
        
       Implementing a class with void*
        
       Author : azhenley
       Score  : 14 points
       Date   : 2021-08-30 21:31 UTC (1 hours ago)
        
 (HTM) web link (web.eecs.utk.edu)
 (TXT) w3m dump (web.eecs.utk.edu)
        
       | prewett wrote:
       | I'm surprised he doesn't refer to it by name (Pimpl). In C++ it
       | has the advantage that you can change your implementation and
       | retain binary compatibility because the size of your class
       | doesn't change as you add/remove member variables (and maybe more
       | surprisingly, add/removing virtual functions). If you're going to
       | use C++, seems like it would be better to avoid the void* by
       | class C {       protected:         struct Impl;
       | std::unique_ptr<Impl> mImpl;       };
       | 
       | And then define C::Impl in the .cpp file.
        
         | anthony_r wrote:
         | Came here to say exactly that. You can also do this, thought it
         | looks a little worse it allows for even more flexibility, such
         | as complete decoupling of Impl from A across different files:
         | // Forward declaration of Impl. What does Impl do?       //
         | You're not allowed to know.       class Impl;            class
         | A {       protected:         Impl* mImpl;       };
         | 
         | I've been using this trick but for a different reason - to
         | reduce the number of #include statements in header files that
         | are included a lot themselves.
        
       | sillycross wrote:
       | This is a well-known way to achieve separation of definition and
       | implementation.
       | 
       | The disadvantage of the method proposed in the article is that,
       | now everything needs a pointer indirection.
       | 
       | A solution that fixes the drawback is used by lz4's library
       | implementation: instead of storing a void star, store a char[]
       | array of same size as the real struct. (of course, now you have
       | to manually make sure the struct size are in sync. It's more
       | error prone, but still not _that_ bad).
        
         | guerrilla wrote:
         | Why not `typedef struct state state_t` in the header file, then
         | have a `state_t state` in the header file with the `struct
         | state { ... }` definition in the source file? This is similar
         | to what I do in C, I don't see why it wouldn't work in C++.
        
           | kyralis wrote:
           | The module that's importing the header needs to know the
           | state size. To do that, it either needs to see the struct
           | declaration or be given the explicit size with the array
           | approach.
        
         | [deleted]
        
       ___________________________________________________________________
       (page generated 2021-08-30 23:00 UTC)