条件成员函数

2024-03-11

关于在 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(使用前将#替换为@)

条件成员函数 的相关文章

随机推荐

  • Swift NSTimer 动态改变间隔[重复]

    这个问题在这里已经有答案了 如何更改 NSTimer 上的时间间隔 var difficulty Double 1 0 override func viewDidLoad super viewDidLoad NSTimer schedule
  • Blazor - 动态改变角色

    我有一个 blazor 应用程序 在页面中我使用以下代码根据当前用户角色显示一些部分
  • 如何为按钮的按下状态设置不同的颜色?

    我有一些Buttons在我的 Android 应用程序上 它们有图标和文本 我可以设置a的背景颜色Button在java代码中 如果单击该按钮 我想以不同的颜色显示 那么 如何为按下状态设置不同的颜色Button
  • HTML2PDF 字符集中有 æøå 字符

    content html2pdf new HTML2PDF P A4 en html2pdf gt writeHTML content false html2pdf gt Output S 给我一个带有 的 PDF 文件 我检查了 html
  • 更改应用栏的颜色

    我试图理解 两者之间有什么区别Toolbar Appbar ActionBar 我正在尝试将 AppBar 或其他任何内容的颜色更改为红色 有人提到尝试更改主题 我尝试过 但不知道有什么区别 而且我也是 Android 编程新手 所以如果你
  • 我应该将 _method=PUT/DELETE 存储在帖子中还是网址中

    我正在使用 ASP NET MVC 构建 RESTful Web 应用程序 并计划通过 POST 传输 PUT 和 DELETE 请求 因为这似乎是最实用的解决方法 我想知道的是 我是否应该像这样通过 url 传输信息
  • 可以将选项添加到 npm package.json 依赖项中吗?

    我对 sqlite3 包有依赖性 默认情况下 安装时 sqlite3 软件包会下载并使用 sqlite3 引擎的预打包版本 使用 sqlite3 扩展时有时会出现问题 因此可以选择使用以下命令安装它 npm install build fr
  • 填充其父项的 ListBoxItem

    我正在开发一个 Windows Phone 应用程序 我有以下 XAML
  • 将相对路径转换为绝对路径?

    我不确定这些路径是否重复 给定相对路径 如何使用 shell 脚本确定绝对路径 Example relative path x y a b z c d absolute path a b c d 我在unix中遇到的最可靠的方法是readl
  • 为什么不能在 Slick 中使用已编译的 Insert 语句

    狡猾的专家 我正在学习和使用 Slick 我有一个问题 文档说编译查询仅适用于选择 更新和删除 http slick typesafe com doc 2 0 0 queries html compiled queries http sli
  • Spark DataFrame 重新分区:未保留的分区数

    根据 Spark 1 6 3 的文档 repartition partitionExprs Column 应保留结果数据框中的分区数量 返回按给定分区划分的新 DataFrame 保留现有分区数量的表达式 取自https spark apa
  • 无法启动模拟器:错误:模拟器在 60 秒内未连接

    我无法使用 VSCode for Flutter 进行调试 我正在使用 Windows 并且正在尝试使用 Android 模拟器 我尝试重新安装 Flutter Android SDK 和 VSCode 来解决该问题 并尝试设置环境变量 这
  • 恢复 C# Windows 窗体背景色

    我在 Windows 窗体窗体上有一个按钮 我将其背景颜色更改为Color Yellow当它被点击时 当再次单击它时 我想将其恢复为原始默认外观 默认背景色是SystemColor Control 当第一次单击按钮时 我唯一改变的是 btn
  • iOS 的标准语法解析器是什么?

    iPad 和 iPhone 的 iOS 支持解析器吗 特别是 lex yacc 或 flex bison 是否可用于 iOS 开发 xcode4 有原生支持的库吗 我可以通过 lex yacc 生成语法 然后获取 c 文件并将它们放入我的项
  • 在当前正在写入的文件上创建 FileInfo 是否安全?

    在我的应用程序 C 4 5 winforms 应用程序 中 我定期检查文件夹的内容并将找到的任何文件的详细信息存储到数据库中 在此例程中 我创建了一个FileInfo实例使用new FileInfo path 我读了属性CreationTi
  • 使用 Apache POI 读取 excel 文件

    我创建了这段代码来使用 Apache POI 读取 excel 文件的内容 我使用 eclipse 作为编辑器 但是当我运行代码时 我在粗体行中遇到了问题 有什么问题 excel的内容如下 Emp ID Name Salary 1 0 jo
  • Jenkins 与 Google Cloud 源存储库

    我正在尝试使用 Jenkins 进行 CI CD 我开发了一个Python Flask 应用程序 我正在将此应用程序部署到 Google App Engine 中 到目前为止我正在使用gcloud app deploy app yaml将应
  • 单击提交时验证文本区域

    我正在开发允许用户向系统发送反馈的网站 我使用文本区域和提交按钮创建了反馈表 最重要的是 当用户点击提交时 如果用户输入了一些我不希望他们输入的单词 该反馈将不会发送到系统 它会提醒用户在点击提交之前删除该单词 从现在开始 我只是创建一个简
  • 数据库中的最佳货币格式

    在我的数据库中与 ASP NET Web 应用程序结合使用的最佳货币格式是什么 我不确定浮点数和小数哪个更好 请注意 我不需要特定于文化的设置 如果您使用的是 SQL Server 则您拥有 money 类型 它会转换为 NET 中的十进制
  • 条件成员函数

    关于在 C 类中条件定义成员函数的建议是什么 问题集中在限制 DLL 中某些类的外部暴露 特别是当这些类作为参数传入时 显然这不是您想要对数据成员做的事情 但是函数应该没问题 不是吗 例如 class A public void func1