[英]How to pass a member function to a class constructor?
我想将我的类Worker传递给函数的指针,但是在我调用构造函数时出现了一些问题。
Worker.h
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();
}
这就是我想要做的。工作人员应执行任何函数的函数调用。 (更新是没有属性的空白,不是静态或const等。)
Main.cpp的:
_worker = new Worker(someClass->Update());
首先,当函数是类的non static
成员函数时,其第一个参数是调用其的对象。
在您的示例中,对象someClass
函数Update()
的实际代码是“ void Update(&someClass)”
其次,当您执行Update()
,您将调用该函数,因此将其返回值返回到Worker
构造函数中。
要使用成员函数指针,语法为: &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风格,即老式的void *
类型:
void someClassUpdateWrapper(void *obj) {
SomeClassType someClass = static_cast<SomeClassType *>(obj);
someClass->Update();
}
您将不得不稍微更改声明:
class Worker : public QObject
{
Q_OBJECT
public:
Worker(void (*process)(), void *obj);
...
private:
void (*_task)();
void *_obj;
};
然后:
Worker::Worker(void (*task)(), void *obj;)
{
_task = task;
_obj = obj;
}
void Worker::work()
{
_task(_obj);
paused();
}
最后:
_worker = new Worker(someClassUpdateWrapper, static_cast<void *>(someClass));
但这失去了C ++ 11方式允许的所有可能的类型控件-发明了std::function
和std::bind
的原因...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.