【问题标题】:C++ how to have seperate versions of the same method?C ++如何拥有相同方法的不同版本?
【发布时间】:2018-07-04 18:48:14
【问题描述】:

如果我不知道我想要完成的事情的正确词,我很抱歉。

基本上我有一个事件处理程序对象,它只有一个成员。该成员是一个舞台对象。

当事件处理程序接收到一个事件时,我希望它简单地使用舞台对象来调用相关方法。例如:

Event event; //this event is not part of my code, but rather the library I'm using.

Stage s;                    // my custom class object

EventHandler event_handler; //also my custom class object
event_handler.stage = &s;

if(event == SHUTDOWN) {
    event_handler.stage->handle_shutdown();
}

所以我想要完成的是,随着时间的推移,我的程序将进入单独的范围,并且我希望每个范围都可以访问 event_handler,以便它们可以执行以下操作:

void some_other_scope(EventHandler* eh) {
    Stage* some_new_stage = new Stage(...);
    eh->stage = some_new_stage;
}

这样,原始事件代码保持不变,事件处理程序将在与最初不同的对象上调用 handle_shutdown。

所以我想做的是重载handle_shutdown方法,这样就可以有不同的实现了。我知道基本的重载是如何工作的,可以通过指定不同的参数来完成,但是有没有办法根据创建对象的文件对同一个类方法有不同的定义?

我希望有几个文件,每个文件都有自己的 some_other_scope() 函数,每个文件都可以根据文件的需要重新定义 handle_shutdown 方法来做不同的事情。

我确定有办法做我想做的事,只是我不知道该用什么词。

【问题讨论】:

  • 您是在谈论“动态调度”、“泛型”和/或“模板函数”还是“函数覆盖”?这些是常见的面向对象技术。您可能想探索可以在这里使用的各种design patterns

标签: c++ oop inheritance overloading abstract


【解决方案1】:

看来你想使用多态性:

class IStage
{
public:
    virtual ~IStage() = default;
    virtual void handle_shutdown() = 0;
    // ...
};

class Stage1 : public IStage
{
public:
    void handle_shutdown() override { /*Implementation1*/ }
    // ...
};

class Stage2 : public IStage
{
public:
    void handle_shutdown() override { /*Implementation1*/ }
    // ...
};

然后

struct EventHandler
{
    std::unique_ptr<IStage> stage;
    // ...
};

EventHandler event_handler;
event_handler.stage = std::make_unique<Stage1>();

if (event == SHUTDOWN) {
    event_handler.stage->handle_shutdown();
}

// Later
event_handler.stage = std::make_unique<Stage2>();

if (event == SHUTDOWN) {
    event_handler.stage->handle_shutdown();
}

【讨论】:

  • 有趣,所以看来我缺少的是唯一指针和覆盖语句,我什至不知道这是一件事。唯一指针究竟是如何工作的,在这个例子中它对我有什么作用?
  • std::unique_ptr 为你处理内存,所以没有new/delete。在您的示例中,您甚至会遇到问题,因为 &amp;s 不需要 deletenew Stage(...) 会。
  • 我认为您缺少的是多态性的概念。使用智能指针只是这个特定示例的一个实现细节。
  • 这最终对我有用。我只需要添加#include 并将编译器更改为使用c ++ 14,它可以完美运行,谢谢。
猜你喜欢
  • 2019-08-05
  • 2012-09-27
  • 1970-01-01
  • 2019-10-12
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
相关资源
最近更新 更多