gpt4 book ai didi

c++ - 扩展类

转载 作者:太空狗 更新时间:2023-10-29 20:41:33 30 4
gpt4 key购买 nike

编辑回答:虽然我最初的问题并没有完全按照康拉德鲁道夫提供的答案来解释我的需求,但他(无意或故意)基本上为我写了我想写的东西!类本身没有得到扩展,但是通过使类知道允许它(类)处理更广泛的问题的新功能来扩展它的功能。非常感谢您提供了一个很好的答案,这反过来也是一个很好的教程,即使它确实需要一些 ahemm 灯?我看书 ;-).

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

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

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

那么我的问题是:

因为在 error.h 我有代码:

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

然后在 error_handler.cpp 中完成这些定义,

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

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

编辑:到目前为止的答案和评论似乎表明我正在尝试做一些语言不打算做的事情。如果是这样,那就这样吧,我在这里学到了一些东西。希望情况并非如此,我会暂时保留这个问题,看看还有什么可能会出现在这篇文章中……

最佳答案

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

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

然后您可以拥有以下(简化的)error_handler 类:

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 – 否则语法略有变化)。

现在,这个类的定义是固定的。您可以添加在其他文件中定义的其他处理程序,只需调用 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);

关于c++ - 扩展类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20999263/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com