Qt 中的实现指针 (PIMPL)

Posted

技术标签:

【中文标题】Qt 中的实现指针 (PIMPL)【英文标题】:Pointer to implementation (PIMPL) in Qt 【发布时间】:2020-02-17 14:21:00 【问题描述】:

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

Dll 包含文件:

#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;
    ;

私有包含文件:

namespace M

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

还有cpp文件:

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 设置为编译器。

【问题讨论】:

【参考方案1】:

您的代码看起来很合适,它应该独立于 IDE。 您可以使用this,但我认为this 是您要搜索的内容。

【讨论】:

当然我自己的代码是我尝试的第一件事。没用。【参考方案2】:

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

DLL 包括:

#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;
;

私人包括:

namespace M

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

CPP 文件:

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

DllExport M::P::~P() 

DllExport int M::P::aFunction (/* some arguments*/)

    #...

如果有人认为有更好的想法,请分享。

【讨论】:

以上是关于Qt 中的实现指针 (PIMPL)的主要内容,如果未能解决你的问题,请参考以下文章

何时在 C++ 中的嵌套类上使用 Pimpl 模式,反之亦然?

使用智能指针进行继承的 pimpl

如何将 pimpl 成语与 Qt 和 QObject 的子类一起使用

指向 C++ 中类的指针的 PIMPL 习语

如何使用 Loki 的 Pimpl 实现?

C++在使用PImpl技术时,template/typename的不常见用法