C++ 从头文件中删除pimpl

C++ 从头文件中删除pimpl,c++,shared-libraries,pimpl-idiom,C++,Shared Libraries,Pimpl Idiom,我目前已经使用pImpl习惯用法实现了一个库(只是一个示例) 或者这会对使用库的项目产生不必要的后果吗?这不是一个好主意。带pimpl的lib_public_type的内存签名不同于不带pimpl的lib_public_type。如果将lib\u public\u type传递到库中,比如调用非静态方法时,Crom只知道会发生什么。这就是我所担心的,您可以推荐任何其他习惯用法或解决方案来获得“cleaner”头吗?只需完全删除该类并将其替换为不透明对象,即表示该类的句柄,还有一些免费函数,它们获

我目前已经使用pImpl习惯用法实现了一个库(只是一个示例)


或者这会对使用库的项目产生不必要的后果吗?

这不是一个好主意。带pimpl的
lib_public_type
的内存签名不同于不带pimpl的
lib_public_type
。如果将
lib\u public\u type
传递到库中,比如调用非静态方法时,Crom只知道会发生什么。这就是我所担心的,您可以推荐任何其他习惯用法或解决方案来获得“cleaner”头吗?只需完全删除该类并将其替换为不透明对象,即表示该类的句柄,还有一些免费函数,它们获取并释放句柄,将句柄转换为类实例,并调用类上的适当方法。与pimpl一起生活可能会更好。另一方面,如果你打算使用共享库,这可能是一种方式。您可能无法保证库的所有用户都将使用完全相同的
std::unique_ptr
实现。这不是一个好主意。带pimpl的
lib_public_type
的内存签名不同于不带pimpl的
lib_public_type
。如果将
lib\u public\u type
传递到库中,比如调用非静态方法时,Crom只知道会发生什么。这就是我所担心的,您可以推荐任何其他习惯用法或解决方案来获得“cleaner”头吗?只需完全删除该类并将其替换为不透明对象,即表示该类的句柄,还有一些免费函数,它们获取并释放句柄,将句柄转换为类实例,并调用类上的适当方法。与pimpl一起生活可能会更好。另一方面,如果你打算使用共享库,这可能是一种方式。您可能无法保证库的所有用户将使用完全相同的
std::unique_ptr
实现。
// library.h

class lib_public_type
{
    class impl;
    std::unique_ptr<impl> impl__;

public:
    void libTypeFunction();
}

// library.cpp
#include "library.h"

class lib_public_type::impl
{
private:
    std::string libVar1;

    void libPrivateFunction1()
    {
        ...
    }

    void libPrivateFunction2()
    {
        ...
    }
}

lib_public_type::libTypeFunction()
{
    libPrivateFunction1();
    libPrivateFunction2();
}
// library.h
#ifndef PROVIDES_IMPL
    // define as empty string if not already defined
    #define PROVIDES_IMPL 
#endif 

class lib_public_type
{
PROVIDES_IMPL

public:
    void libTypeFunction();
}

// library.cpp
#define PROVIDES_IMPL class impl;\
    std::unique_ptr<impl> impl__;

#include "library.h"

...