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

时间:2016-12-16 13:49:07

标签: c++ function-pointers

我想传递我的类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());

2 个答案:

答案 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::functionstd::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::functionstd::bind被发明的原因......