Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将成员函数作为参数传递给多个级别的类_C++_C++11_Exception_Std Function_Stdbind - Fatal编程技术网

C++ 将成员函数作为参数传递给多个级别的类

C++ 将成员函数作为参数传递给多个级别的类,c++,c++11,exception,std-function,stdbind,C++,C++11,Exception,Std Function,Stdbind,我有3个不同的类,类-使用者正在被用户使用。我基本上希望用户给出在worker中出现错误时必须执行的方法。所以我得把这个传给工人阶级 使用者类实例化订阅者类,订阅者类又实例化工作者类。我在consumer类中有一个方法-onerrorReceived。我想将此函数作为参数传递给subscribe.create方法,该方法将调用subscribe的构造函数,并将函数传递给worker的构造函数。如果出现任何错误,worker方法将在内部调用此方法 我读过关于lambda、std::func、std

我有3个不同的类,类-使用者正在被用户使用。我基本上希望用户给出在worker中出现错误时必须执行的方法。所以我得把这个传给工人阶级

使用者类实例化订阅者类,订阅者类又实例化工作者类。我在consumer类中有一个方法-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(); });
auto consumer=std::使_共享(topics.size());
自动订户=订户::创建(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);

Subscriber(const配置&conf,iRecordConsumer消费程序,std::function);
静态std::shared_ptr create(const-Configuration&conf,IRecordConsumerPtr-consumer,std::function f);
在subscriber.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))
{}
std::shared\ptr订户::创建(const配置和conf,
iRecordConsumer消费者,
std::函数f)
{
自动订阅服务器ptr=std::shared_ptr(新订阅服务器(conf,consumer,std::bind(&f));
返回subscriberPtr;
}
订阅者::订阅者(const配置和配置、IRecordConsumerPtr消费者、std::函数f)
:myLogger(cpplogger::get_实例(“class.cp.Subscriber”)、myConsumer(consumer),
myWorker(std::make_shared(“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;

explicit Worker(std::string name,std::function f);
函数回调;
工人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);
    }
}
Worker::Worker(std::string name,std::function f):myName(std::move(name)),回调(f)
{}
...
void Worker::run()
{
试一试{
...
}捕获(const std::exception&e){
std::exception_ptr eptr=std::current_exception();
回调(eptr);
}
}

有人能指出我遗漏了什么吗。我是C++新手。所以请告诉我一些有价值的资源,我可以从中学习如何修复这个问题。

Subscriber::create
需要一个可调用的对象,该对象将
std::exception\u ptr
作为参数。您正在传递不带参数的lambda。请删除所有
std::bind
调用。
std::function
的实例可以像您所希望的那样进行传递,例如
int
std::string
Subscriber::create
需要一个以
std::exception\u ptr
为参数的可调用对象。您正在传递不带参数的lambda。请删除所有
std::bind
调用。可以像传递
int
std::string一样传递
std::function
的实例