Я пытаюсь создать библиотеку, которая выставляет один класс наружу с идиом 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;
};