Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.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++ - Fatal编程技术网

C++ 如何将成员函数作为函数指针传递?

C++ 如何将成员函数作为函数指针传递?,c++,C++,我想在worker类中添加一个logger函数, 如何将成员函数作为函数指针传递? 使用mem_fun 以下是代码示例: class Work{ public: void (*logger) (const string &s); void do_sth(){if (logger) logger("on log")}; }; classs P{ public: void log(const string &s)(cout << s); };

我想在worker类中添加一个logger函数, 如何将成员函数作为函数指针传递? 使用mem_fun

以下是代码示例:

class Work{
public:
    void (*logger) (const string &s);
    void do_sth(){if (logger) logger("on log")};
};

classs P{
public:
    void log(const string &s)(cout << s);
};

int main(){
    Work w;
    P p;
    w.logger = &p.log;
    w.do_sth();
}
课堂作业{
公众:
无效(*记录器)(常量字符串和s);
void do_sth(){if(logger)logger(“on log”)};
};
类别P{
公众:

无效日志(常量字符串和s)(cout唯一的方法是作为一个静态函数。不幸的是,静态函数不是绑定到单个对象,而是类的全局函数。如果幸运的话,使用函数指针的函数也会带一个void*,您可以使用它来绑定到原始对象-您的静态函数可以将其转换回对象指针和c所有的另一个函数都在对象上做实际的工作。

这将需要闭包,C++没有完全的。你可以做函子和使用模板,但是你必须走一些路。

你可以用<代码> STD::函数< /COD>和<代码> STD::BIN < /C> >:< /P>
#include <functional>
#include <iostream>
#include <string>

class Work {
public:
    std::function<void(const std::string&)> logger;
    void do_sth() { logger("on log"); }
};

class P {
public:
    void log(const std::string& s) { std::cout << s; }
};

int main() {
    Work w;
    P p;
    w.logger = std::bind(&P::log, p, std::placeholders::_1);
    w.do_sth();
}
#包括
#包括
#包括
课堂作业{
公众:
函数记录器;
void do_sth(){logger(“on log”);}
};
P类{
公众:

void log(const std::string&s){std::cout@linjunhalida:James McNellis击败了我。他的答案更好。@James McNellis,不应该
std::占位符::_1
be
std::tr1::占位符::_1
在我的实际项目中,我使用(并编译好):使用名称空间std;device.logger=boost::bind(&CDeviceTesterDlg::logger,this,_1)@Praetorian:这取决于从何处获得
bind
。各种较旧的实现在命名空间
std::tr1
中都有它和相关的名称,这是tr1 library extensions规范中为它们指定的位置;最新的标准库版本在命名空间
std
中有它们的名称,这就是它们的位置指定位于(即将发布的)C++0x标准。@linjunhalida:为了可能需要维护代码的人的利益,请,请,请不要使用
使用名称空间std;
。没有充分的理由使用它,它只会带来麻烦。我接受建议,为什么不使用名称空间std?任何讨论链接?我认为这是一种非常常见的设计模式。