扩展一个类

2024-05-26

编辑回答:虽然我最初的问题并没有完全按照康拉德·鲁道夫提供的答案所解决的方式解释我的需求,但他(无意或有意)基本上为我写了我想写的内容!类本身不会被扩展,但通过使类了解新函数来扩展其功能,这些新函数允许它(类)处理更广泛的问题。我非常感谢您提供了一个出色的答案,这反过来也是一个很棒的教程,即使它确实需要一些嗯嗯光?我读书;-)。

我确信这是一个非常基本的问题,但我正在尝试自学 C++,而我正在使用的参考书提供了我不理解的答案。

对于我的项目,我定义了一个class error_handler {}它处理来自程序各个点的异常消息和错误号。它将使用各种成员函数将错误记录到文件中和/或将消息打印到屏幕上。

我的目标是创建它,以便它拥有自己的 .h 和 .cpp 文件,如果我以后需要扩展它,只需添加一个新的成员函数来处理一些更模糊类型的错误操作。

那么我的问题是这样的:

自从在error.h我有代码:

class error_handler
{
  // ctor dtor copy logger screen functions defined
}

And in error_handler.cpp我完成了这些定义,

我怎样才能简单地向类中添加一个新函数?我不想子类化它,只需扩展它。

对于用例场景,假设 error_handler 是在专有包中定义的类,我不能直接修改源代码,但可以在单独的代码中扩展它。

编辑:到目前为止的答案和评论似乎表明我正在尝试做一些语言不应该做的事情。既然如此那就这样吧,我在这里学到了一些东西。希望情况并非如此,我将把这个问题暂时搁置一下,看看这篇文章中还会出现什么内容......


这很大程度上取决于这些功能是什么。考虑到您的应用程序,我将继续假设您要添加的函数是用来处理其他错误类型的。

为了简单起见,我们假设每个函数(我们称之为handle)只是传递一个错误对象,它会分析并处理或不处理该错误对象。它返回一个bool来表明这一点。

然后你可以得到以下(简化的)error_handler class:

class error_handler {
public:
    using handler_t = bool (*)(error const&);
    std::vector<handler_t> handlers;

    // …

    void add_handler(handler_t handler) {
        handlers.push_back(handler);
    }

    void handle_error(error const& error) {
        for (auto const& handler : handlers)
            if (handler(error))
                break;
    }
};

这是假设您的错误由类的实例表示error(并且您使用的是 C++11 – 语法略有变化)。

现在,这个类的定义是fixed。您可以添加在其他文件中定义的其他处理程序,只需调用 add_handler`。下面是两个例子:

// Simple logging “handler”. Needs to be added first!

extern error_handler global_error_handler;

bool log_handler(error const& error) {
    std::cerr << error.message() << '\n';
    return false; // We only log, we don’t handle.
}

global_error_handler.add_handler(log_handler);
// Handler for missing dog food

extern error_handler global_error_handler;

errno_t const MISSING_DOG_FOOD = 42;

bool dog_food_missing(error const& error) {
    if (error.code() != MISSING_DOG_FOOD)
        return false;

    global_dog_food_container.add(some_food());
    return true;
}

global_error_handler.add_handler(dog_food_missing);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

扩展一个类 的相关文章

  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 图像右边缘淡入/模糊 CSS

    我有一个简单的 CSS 相关问题 如何获得如图所示的右端模糊 淡入淡出 两种方法 让我们这样做 1 使用盒子阴影 浏览器兼容性 IE 9 为盒子阴影 http caniuse com feat css boxshadow 放置适当box s
  • MacVim:跨窗口共享命名寄存器?

    我想跨 MacVim 窗口共享命名寄存器缓冲区 就像我在单个实例中跨缓冲区一样 换句话说 假设我标记了一个位置 m 然后去其他地方 我将一些文本拉入寄存器 a 从当前点到 m a m 然后我转到另一个窗口 不 我不是指同一窗口中的另一个分割
  • 将node.js +expressjs应用程序的NODE_ENV设置为ubuntu下的守护进程

    我按照这些说明让守护进程正常工作 http kevin vanzonneveld net techblog article run nodejs as a service on ubuntu karmic http kevin vanzon
  • 为什么这段代码不会产生编译错误?

    template
  • MySQL使用long类型数字过滤varchar类型时返回额外记录

    一个简单的表格 CREATE TABLE tbl type test uid varchar 31 NOT NULL DEFAULT 0 value varchar 15 NOT NULL DEFAULT PRIMARY KEY uid E
  • 在unity3D中显示数学方程

    我想使用它的 GUI 系统统一显示数学方程 有办法吗 我正在使用 C 语言在 Unity 中进行编程 如果我还可以使用 C 代码显示数学符号 这对我来说会很有用 谢谢 自 2016 年起 您可以使用TEXDraw https assetst
  • 将整数值从数据库列转换为Oracle中的文本

    我对数据库有一个要求 1 表ABC 列 check amount number number 18 4 这基本上包含例如支票金额 3000 50 支付给雇员 现在签发了一张支票 该支票包含数字和文本形式的 check amount 例如 支
  • 如何使用 HttpClient 验证 Pardot API

    我花了大约一天的时间尝试对 Pardot API 进行身份验证 它不喜欢我尝试发布消息正文的方式 所以我想发布对我有用的解决方案 如果您有任何建议或替代方案 我想听听 ServicePointManager SecurityProtocol
  • 导入错误:没有名为 app_name 的模块

    我是 python 新手 我在 SO 上看到过类似的问题 但无法弄清楚我的 Django 应用程序出了什么问题 在 settings py 中 我以点线模块形式添加了我的应用程序 INSTALLED APPS django contrib
  • IntelliJ Play2 设置未保存

    在 IntelliJ 中 我尝试在语言和框架中保存 Play 2 编译器的以下设置 但它没有被保存 文件 设置 语言和框架 Play 2 激活 使用Play 2 确定当我随后按照上述步骤查找此设置时 它没有被激活 有谁知道为什么它没有被保存
  • PHP 指针与引用

    在 PHP 中 使用指针有什么区别 例如 function foo var var 3 a 0 foo a 以及参考 function foo var var 3 a 0 foo a 它们都修改了原始变量的值 但是它们内部的表示方式不同吗
  • 不同的 IntentServices 可以并行运行吗?

    我有点难以理解有关 IntentServices 的一条规则 From 创建后台服务 https developer android com training run background service create service ht
  • 我可以使用本机系统窗口作为父窗口使 JDialog 成为模式吗?

    我有一个 JDialog 窗口 我需要使其成为模态窗口 但父窗口不是 Java 窗口 而是本机 Windows 操作系统窗口 是否可以 不 你不能 您甚至无法不仅引用本机窗口 甚至无法引用运行在其他 JVM 中的 java 应用程序创建的窗
  • 使用 git filter-branch 然后 git push --force 清除大文件后,远程(Gitlab)上的 Git 存储库大小仍然很大

    我已按照 Gitlab 文档中有关 使用 Git 减少存储库大小 的说明进行操作 通过从历史记录中清除大文件 https docs gitlab com ee user project repository reducing the rep
  • 获取RFC返回的嵌套结构的值?

    我是 C 新手 我有 rfc 它以嵌套结构的形式从 SAP 系统返回数据 但是当我使用以下方式获取该数据时 IrfcTable table rfc getTable exporting parameter et customer 它仅返回第
  • 在 WPF 中以编程方式设置 ComboBox SelectedItem (3.5sp1)

    在安装了 Net Framework 3 5 sp1 的 wpf 应用程序中以编程方式设置 SelectedItem 时 我感到很困惑 我仔细阅读了数百篇文章 主题 但仍然感到困惑 我的xaml
  • 自定义 UITableViewCell 中按钮上的 IBAction

    使用 iOS 5 我有一个场景 我必须使用自定义单元格创建一个 tableView 自定义单元格有一个名为 TainingCellController 的控制器 UITableViewCell 的子类和一个 NIB 文件 TrainingC
  • 有没有办法降低 scipy/numpy 精度以减少内存消耗?

    在我的 64 位 Debian Lenny 系统 4GByte RAM 4GByte 交换分区 上 我可以成功执行以下操作 v array 10000 random 512 512 512 dtype np int16 f fftn v 但
  • 可重复部分中重复的 Orbeon 指数

    我有可重复部分 不是中继器 其中有输出字段 如何将重复索引放入此输出 我想将输出与当前迭代的索引绑定 例如 如果我添加 5 个重复 我希望输出显示它们的索引 1 2 3 4 5 我知道有像 xxf index 这样的函数 但它们只在中继器中
  • 扩展一个类

    编辑回答 虽然我最初的问题并没有完全按照康拉德 鲁道夫提供的答案所解决的方式解释我的需求 但他 无意或有意 基本上为我写了我想写的内容 类本身不会被扩展 但通过使类了解新函数来扩展其功能 这些新函数允许它 类 处理更广泛的问题 我非常感谢您