关于在C ++类中有条件地定义成员函数的建议是什么? (问题集中在限制DLL中某些类的外部暴露 - 特别是当这些类作为参数传入时)。显然,这不是你想对数据成员做的事情,但是功能应该不行吗?
例如:
class A
{
public:
void func1();
#ifdef _CONDITION_
void func2(B b);
#endif
};
编辑: 添加了公共修饰符以避免示例混淆。
答案 0 :(得分:2)
不完全确定您的要求,但如果成员函数是私有的,请使用'private:'关键字将其设为私有。
如果相反,它们打算在类所在的模块的上下文中被其他类使用,但是您不希望外部实体知道它们,请将它们公开但从“接口”派生类基类,并将该接口基类公开给外部实体。
答案 1 :(得分:2)
通常,如果您不想暴露导出类的某些部分,那么您应该考虑不暴露该类的选项,而是提供您的类继承的抽象接口。
例如
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的标题。
编辑:对第一条评论的回应
如果您有某些类型(第三方或其他类型),您希望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中的实现和第三方类型。缺点是你显然必须创建所有这些代理对象接口。
答案 2 :(得分:0)
通常使用public
/ protected
/ private
声明以及可能friend
s而不是预处理器条件来完成这类事情。但是在一个程序中,我已经写过将某些函数声明为私有或受保护的更多问题(因为需要访问它们的独立函数的数量),我为伪私函数添加了前缀带有下划线的名称(以及解释原因的明确注释),向读者清楚地表明这些功能不适用于一般用途。
答案 3 :(得分:0)
你说你想要阻止某些类的可见性,但你的例子只隐藏了一个方法。
如果某个类不构成DLL的“公共”界面的一部分,则无需发布标题。例如:
// foo.h
class Bar;
class Foo
{
private Bar* _bar;
...
}
此处“Bar”是实现的一部分,因此无需发送其标头。如果Bar仅由Foo使用,您也可以在Foo中的私有/受保护范围内定义它。