Я думаю, что у меня есть, но мне нужно, чтобы вы, ребята, проверили это, чтобы убедиться, что у меня хороший дизайн. Таким образом, в основном pimpl реализован правильно, но проблема заключается в расширении структуры данных (скажем, добавление новой переменной-члена, скажем, var3 в оригинальном сообщении), которое у меня есть в dll и должно быть доступно приложению И новой версии dll (скажем, v2) должен работать с текущей версией приложения (скажем, v2) и предыдущей (скажем, v1), поэтому без перекомпиляции приложения (следовательно, совместимость с v1). Я разместил только необходимое (облегчает чтение :-)), код компилируется, запускается и работает, но это хороший дизайн для требований, изложенных выше и в моем оригинальном посте.
idcom_global.h:
#if defined( IDCOM_LIBRARY )
#define IDCOMDLL_API __declspec( dllexport )
#else
#define IDCOMDLL_API __declspec( dllimport )
#endif
idcom.h:
#include "idcom_listitem.h"
class idcomImpl;
class idcom
{
public:
IDCOMDLL_API idcom();
IDCOMDLL_API ~idcom();
bool IDCOMDLL_API retrieveList( std::vector< ListItem >& list );
private:
std::unique_ptr< idcomImpl > m_impl;
};
idcom. cpp:
idcom::idcom() :
m_impl( new idcomImpl())
{}
idcom::~idcom() = default;
bool idcom::retrieveList( std::vector< ListItem >& list )
{
return m_impl->retrieveList( list );
}
idcomimpl.h :
class idcomImpl
{
public:
idcomImpl(){};
~idcomImpl(){};
bool retrieveList( std::vector< ListItem >& worklist );
};
idcomimpl. cpp:
bool idcomImpl::retrieveList( std::vector< ListItem >& worklist )
{
....//implementation here
}
idcom_listitem.h:
struct IDCOMDLL_API ListItem
{
std::string id;
std::string lastname;
std::string firstname;
std::string prefix;
//expansion of members here in the future e.g. std::string dateOfBirth;
};