条件成员函数

| 关于在C ++类中有条件地定义成员函数的建议是什么? (问题集中在限制DLL中某些类的外部公开-特别是当这些类作为参数传递时)。显然,这不是您要对数据成员执行的操作,但是函数应该可以,不是吗? 例如:
class A
{
public:
    void func1();

#ifdef _CONDITION_
    void func2(B b);
#endif    
};
编辑: 添加了public修饰符以避免示例混淆。     
已邀请:
通常,如果您不想公开导出类的某些部分,则应考虑不公开类,而提供类继承自其的抽象接口的选项。 例如。
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模式为您希望客户端限制使用的每种类型创建代理接口? 例如。
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中。不利的一面是您显然必须创建所有那些代理对象接口。     
不能完全确定您要问的是什么,但是如果成员函数打算对类私有,请使用\'private:\'关键字将它们设为私有。 如果相反,它们打算在该类所在的模块的上下文中供其他类使用,但是您不希望外部实体知道它们,则将它们公开,但从\'interface \派生该类。基础类,并将该接口基础类公开给外部实体。     
通常使用
public
/
protected
/
private
声明(可能还有possibly6ѭs)而不是预处理条件来完成这种事情。但是在我编写的一个程序中,将某个功能集声明为私有或受保护(由于需要访问它们的独立功能的数量)更成问题,我为伪私有添加了前缀函数名称带有下划线(以及清楚的注释解释原因),以使读者清楚地知道这些函数并非一般用途。     
您说您想防止某些类的可见性,但是您的示例仅隐藏了一个方法。 如果某个类不构成DLL的\“ public \”接口的一部分,则无需发布标头。例如:
// foo.h
class Bar;

class Foo
{
    private Bar* _bar;
    ...
}
这里的“ Bar”是实现的一部分,因此不需要发送其标头。如果Bar仅由Foo使用,则还可以在Foo的私有/受保护范围内定义它。     

要回复问题请先登录注册