C++ 如何将成员函数传递给类构造函数?

C++ 如何将成员函数传递给类构造函数?,c++,function-pointers,C++,Function Pointers,我想给我的类工作者传递一个指向函数的指针,但是当我调用构造函数时出现了问题 工人 class Worker : public QObject { Q_OBJECT public: Worker(void (*process)()); public slots: void work(); signals: void error(QString error); void paused(); private: void (*_task)(); }; Worker.cpp: Worker::W

我想给我的类工作者传递一个指向函数的指针,但是当我调用构造函数时出现了问题

工人

class Worker : public QObject
{
Q_OBJECT

public:
Worker(void (*process)());

public slots:
void work();

signals:
void error(QString error);
void paused();

private:
void (*_task)();
};
Worker.cpp:

Worker::Worker(void (*task)())
{
_task = task;
}

void Worker::work()
{
_task();
paused();
}
这就是我想做的。。。 工作者应该执行任何函数的函数调用。 (更新是没有属性的空白,不是静态或常量等)

Main.cpp:

_worker = new Worker(someClass->Update());

首先,当函数是类的非静态成员函数时,它的第一个参数是调用它的对象

在您的示例中,对象
someClass
中函数
Update()
的实际代码是“void Update(&someClass)”

其次,当您执行
Update()
时,您调用该函数,并在
工作者
构造函数中获取其返回值

要使用成员函数指针,语法为:
&ClassType::FunctionName

要使用“普通”函数指针,语法为:
&FunctionName

例如,在您的示例中,您可以将Update函数转换为static,并按如下方式更改构造函数:

_worker = new Worker(&someClassType::Update);

正如有人在评论中所说,如果您想改进代码,请首先从C++11了解std::function,当函数是类的非静态成员函数时,它的第一个参数是调用它的对象

在您的示例中,对象
someClass
中函数
Update()
的实际代码是“void Update(&someClass)”

其次,当您执行
Update()
时,您调用该函数,并在
工作者
构造函数中获取其返回值

要使用成员函数指针,语法为:
&ClassType::FunctionName

要使用“普通”函数指针,语法为:
&FunctionName

例如,在您的示例中,您可以将Update函数转换为static,并按如下方式更改构造函数:

_worker = new Worker(&someClassType::Update);

正如有人在评论中所说,如果您想改进代码,请从C++11了解std::function,这只是Félicie答案的一个变体

如果希望能够传递对任意对象进行操作的方法,C++11的方法将是使用
std::function
std::bind

如果出于任何原因,您必须使用C++11之前的系统,您将不得不恢复到传递任意参数的C-ish风格,即良好的旧
void*
类型:

void someClassUpdateWrapper(void *obj) {
    SomeClassType someClass = static_cast<SomeClassType *>(obj);
    someClass->Update();
}
然后:

最后:

_worker = new Worker(someClassUpdateWrapper, static_cast<void *>(someClass));
\u worker=new worker(someClassUpdateWrapper,static_cast(someClass));

但是这会使C++11方式所允许的所有可能的类型控制都失去——这就是为什么
std::function
std::bind
被发明的原因……

只是Félicie答案的一个变体

如果希望能够传递对任意对象进行操作的方法,C++11的方法将是使用
std::function
std::bind

如果出于任何原因,您必须使用C++11之前的系统,您将不得不恢复到传递任意参数的C-ish风格,即良好的旧
void*
类型:

void someClassUpdateWrapper(void *obj) {
    SomeClassType someClass = static_cast<SomeClassType *>(obj);
    someClass->Update();
}
然后:

最后:

_worker = new Worker(someClassUpdateWrapper, static_cast<void *>(someClass));
\u worker=new worker(someClassUpdateWrapper,static_cast(someClass));

但是这会使C++11方式所允许的所有可能的类型控件都失效-这就是为什么
std::function
std::bind
被发明的原因…

您可能想了解和。至于您的问题,您调用
Update
函数。您不会将函数传递给构造函数,而是传递其结果。您可能希望了解和。至于您的问题,请调用
Update
函数。您不会将函数传递给构造函数,而是传递其结果。