条件成员函数

时间:2011-04-16 02:19:23

标签: c++ function dll conditional member

关于在C ++类中有条件地定义成员函数的建议是什么? (问题集中在限制DLL中某些类的外部暴露 - 特别是当这些类作为参数传入时)。显然,这不是你想对数据成员做的事情,但是功能应该不行吗?

例如:

class A
{
public:
    void func1();

#ifdef _CONDITION_
    void func2(B b);
#endif    
};

编辑: 添加了公共修饰符以避免示例混淆。

4 个答案:

答案 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中的私有/受保护范围内定义它。