Как правило, если вы не хотите показывать части экспортируемого класса, вам следует рассмотреть возможность не предоставлять класс, а вместо этого предоставлять абстрактный интерфейс, от которого наследуется ваш класс.
например.
class AbstractExportedInterface
{
public:
virtual void do_stuff() = 0;
};
class HasStuffIDontWantToExport : public AbstractExportedInterface
{
public:
void do_stuff();
void do_other_stuff_that_i_dont_export();
};
тогда вы будете действовать в предположении, что вы предоставляете HasStuffIDontWantToExport * пользователю DLL, и у них есть только заголовки для AbstractExportedInterface.
РЕДАКТИРОВАТЬ: Ответ на первый комментарий
Если у вас есть некоторые типы (сторонние или иные), которые вы хотите, чтобы ваш клиент DLL мог каким-либо образом использовать, но вы не хотите, чтобы они имели полный доступ к этим типам, и у вас нет гибкости использовать иерархию прямого наследования для создания абстрактного интерфейса. Возможно, вы сможете использовать шаблон pimpl для создания прокси-интерфейсов для каждого из типов, которые вы хотите, чтобы ваш клиент имел ограниченное использование?
например.
class ExportedAbstractProxyObject
{
public:
virtual void do_stuff() = 0;
};
#include <3rdPartyType.h>
class ProxyObject
{
public:
void do_stuff() { pimpl_.actually_do_stuff(); }
private:
3rdPartyType pimpl_;
};
class ExportedAbstractProxyOtherObject
{
public:
virtual void do_stuff_with_thing(ExportedAbstractProxyObject* thing) = 0;
};
class ProxyOtherObject
{
public:
void do_stuff_with_thing(ExportedAbstractProxyObject* thing) { thing->do_stuff(); }
};
Так что тогда вы можете счастливо экспортировать любые интерфейсы, которые вам нравятся, и полностью скрыть реализацию и сторонние типы внутри вашей DLL. Недостатком является то, что вам, очевидно, придется создавать все эти интерфейсы прокси-объектов.