我想传递我的类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();
}
这就是我想要做的...... Worker应该执行任何函数的函数调用。 (更新是没有属性的void,不是static或const等。)
Main.cpp的:
_worker = new Worker(someClass->Update());
答案 0 :(得分:4)
首先,当一个函数是一个类的non static
成员函数时,它的第一个参数就是从中调用它的对象。
在您的示例中,对象Update()
中函数someClass
的真实代码是“void Update(& someClass)”
其次,当你执行Update()
时,你调用该函数,然后在Worker
构造函数中返回它。
要使用成员函数指针,语法为:&ClassType::FunctionName
要使用“普通”函数指针,语法为:&FunctionName
在你的例子中,你可以例如将Update函数转换为static并改变你的构造函数:
_worker = new Worker(&someClassType::Update);
就像有人在评论中说的那样,如果你想改进你的代码,那么从C ++ 11中学习std :: function
答案 1 :(得分:0)
只是Félicie答案的一个变种。
如果您希望能够传递对任意对象进行操作的方法,那么C ++ 11将使用std::function
和std::bind
。
如果出于任何原因你必须使用pre C ++ 11系统,你将不得不恢复为传递任意参数的C-ish风格,好的旧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
被发明的原因......