首页 > 解决方案 > 将成员函数作为参数传递给多个级别的类

问题描述

我有 3 个不同的类,该类 - 消费者正在被用户使用。我基本上希望用户提供在工作人员出错时必须执行的方法。所以我必须以某种方式将它传递给工人阶级

消费者类实例化一个订阅者类,而订阅者类又实例化一个工作者类。我在消费者类中有一个方法-onerrorReceived。我想将此函数作为参数传递给 subscribe.create 方法,该方法将调用 subscribe 的构造函数并将函数传递给 worker 的构造函数。如果出现任何错误,worker 方法将在内部调用此方法。

我阅读了有关 lambda、std::func、std::bind 的信息,并尝试实现它,但我无法实现。

消费类:

    auto consumer = std::make_shared<RdConsumer>(topics.size());
    auto Subscriber = Subscriber::create(conf, consumer, [&consumer](){ consumer->onerrorReceived(); });

在 subcriber.h 中,

    Subscriber(const Configuration& conf, IRecordConsumerPtr consumer, std::function<void(std::exception_ptr)>);
    static std::shared_ptr<Subscriber> create(const Configuration& conf, IRecordConsumerPtr consumer, std::function<void(std::exception_ptr)> f);

在订阅者.C

std::shared_ptr<Subscriber> Subscriber::create(const Configuration& conf,
                                               IRecordConsumerPtr consumer,
                                               std::function<void(std::exception_ptr)> f)
{
    auto subscriberPtr = std::shared_ptr<Subscriber>(new Subscriber(conf, consumer, std::bind(&f)));
    return subscriberPtr;
}

Subscriber::Subscriber(const Configuration& conf, IRecordConsumerPtr consumer, std::function<void(std::exception_ptr)> f)
    : myLogger(cpplogger::get_instance("class.cp.Subscriber")), myConsumer(consumer),
      myWorker(std::make_shared<Worker>("Common Worker"), std::bind(&f))
{}

在 Worker.h 中

    explicit Worker(std::string name, std::function<void(std::exception_ptr)> f);
    std::function<void(std::exception_ptr)> callback;

工人.C

Worker::Worker(std::string name, std::function<void(std::exception_ptr)> f) : myName(std::move(name)), callback(f)
{}

...
void Worker::run()
{
    try {
     ...
   } catch (const std::exception& e) {
        std::exception_ptr eptr = std::current_exception();
        callback(eptr);
    }
}

有人可以指出我在这里缺少什么。我是 C++ 新手。所以请给我一些有价值的资源,我可以学习修复这个问题。

标签: c++c++11exceptionstd-functionstdbind

解决方案


推荐阅读