Qt 中的实现指针 (PIMPL)

Pointer to implementation (PIMPL) in Qt

我用 MSVS 制作了一个 Dll,并成功地使用了 pimpl 方法,如下所示:

Dll include file:

#include <memory>

#define DllExport __declspec( dllexport ) 

namespace M
{
    class P
    {
    public:
        DllExport P(/*some arguments*/);
        DllExport ~P();
        DllExport int aFunction (/* some arguments*/);

    private:
        class C;
        std::unique_ptr<C> mc;
    };
}

The private include file:

namespace M
{
    class P::C
    {
        public:
         # Other variables and functions which are not needed to be exported...
    }
}

And the cpp file:

DllExport M::P::P(/*some arguments*/):mc(std::make_unique<C>())
{
# ...
}
DllExport M::P::~P(){ }

DllExport int M::P::aFunction (/* some arguments*/)
{
#...
}

现在我想在Qt creator中实现这样的方法。我应该做哪些改变?

(我想我必须使用 QScopedPointer 而不是 unique_ptr 但最好的实现形式是什么?)

PS: 我将 clang 设置为编译器。

您的代码看起来已找到并且应该独立于 IDE。 您可以使用 this, but i think this 是您要搜索的内容。

使用 QScopedPointer 我设法让它按照我想要的方式工作:

Dll include:

#define DllExport __declspec( dllexport )

#include <QScopedPointer>

namespace M{
class PPrivate;

class P
{
public:
    DllExport P(/*some arguments*/);
    DllExport ~P();
    DllExport int aFunction (/* some arguments*/);

private:

    Q_DECLARE_PRIVATE(P)
    QScopedPointer<PPrivate> d_ptr;
};
}

Private include:

namespace M
{
    class PPrivate
    {
        public:
            # Other variables and functions which are not needed to be exported...
    }
}

The CPP file:

DllExport M::P::P(/*some arguments*/)
    :d_ptr(new PPrivate())
{ 
    #...
}
DllExport M::P::~P(){ }

DllExport int M::P::aFunction (/* some arguments*/)
{
    #...
}

但是,如果有人认为有更好的主意,请分享。