Библиотека C ++, скрывающая структуры данных членов в pimpl - PullRequest
1 голос
/ 26 февраля 2020

Я пытаюсь создать библиотеку, которая выставляет один класс наружу с идиом pimpl. Эта реализация работает, то есть я могу добавить функциональность в класс "idcomimpl", не нарушая ABI. Но как мне добавить структуру данных во всем этом проекте, который предоставляется приложением и требуется этой библиотекой. Что я хочу знать, так это то, возможно ли реализовать это так, чтобы структура данных была доступна снаружи (приложению), но я все еще могу добавлять переменные-члены в структуру, не нарушая ABI. В настоящее время единственным заголовком, который должен быть включен приложением, является idcom.h. Должен ли я использовать такой же подход pimpl для структур данных, как и для класса idcom?

idcom_global.h:

#if defined( IDCOM_LIBRARY )
 #define IDCOMDLL_API  __declspec( dllexport )
#else
 #define IDCOMDLL_API  __declspec( dllimport )
#endif

idcom.h:

class idcomImpl;

class  idcom
{
public:
    IDCOMDLL_API idcom();
    IDCOMDLL_API ~idcom(){};

    virtual void doSomething();

private:
    std::unique_ptr< idcomImpl > m_impl;
};

idcom. cpp:

idcom::idcom() :
    m_impl( new idcomImpl())
{}

void idcom::doSomething()
{
   m_impl->doSomething();
}

idcomimpl.h :

class idcomImpl
{
public:
    idcomImpl(){};
    ~idcomImpl(){};

    virtual void doSomething(); 
};

idcomimpl. cpp:

void doSomething()
{
....//implementation here
}

idcom_connection.h ======> структура данных, как включить в дизайн ???

struct IDCOMDLL_API idcomConnection
{
    std::string id;
    std::string name;
    std::string type;

    //expansion of members here in the future e.g. std::string fullServerName;
};
...