Указатель на реализацию (PIMPL) в Qt - PullRequest
0 голосов
/ 17 февраля 2020

Я сделал Dll с MSVS и успешно использовал метод 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 в качестве компилятора.

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

Ваш код выглядит найти, и он должен быть независимым от IDE. Вы можете использовать это , но я думаю это - это то, что вы ищете.

0 голосов
/ 29 февраля 2020

Используя 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*/)
{
    #...
}

Тем не менее, если кто-то считает, что есть идея получше, поделитесь.

...