关于在 C++ 类中条件定义成员函数的建议是什么? (问题集中在限制 DLL 中某些类的外部暴露 - 特别是当这些类作为参数传入时)。显然这不是您想要对数据成员做的事情,但是函数应该没问题,不是吗?
例如:
class A
{
public:
void func1();
#ifdef _CONDITION_
void func2(B b);
#endif
};
编辑:
添加了 public 修饰符以避免示例混淆。
通常,如果您不想公开导出类的部分内容,那么您应该考虑选择不公开该类,而是提供您的类继承的抽象接口。
eg.
class AbstractExportedInterface
{
public:
virtual void do_stuff() = 0;
};
class HasStuffIDontWantToExport : public AbstractExportedInterface
{
public:
void do_stuff();
void do_other_stuff_that_i_dont_export();
};
那么您将假设您向 DLL 用户提供 HasStuffIDontWantToExport* 并且它们只有 AbstractExportedInterface 的标头。
编辑:对第一条评论的回应
如果您有某些类型(第 3 方或其他),您希望 DLL 的客户端能够以某种方式使用,但您不希望它们具有对这些类型的完全访问权限,并且您无法灵活地使用直接继承层次结构来创建抽象接口。您也许可以使用 pimpl 模式为您希望客户端有限使用的每种类型创建代理接口?
eg.
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 中的实现和第 3 方类型。缺点是您显然必须创建所有这些代理对象接口。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)