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

How to pass a member function to a class constructor?

本文关键字:构造函数 函数 成员      更新时间:2023-10-16

我想通过我的班级工人一个指针指向效果,但是当我调用构造函数时出了问题...

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

在您的景象中,您可以为静态转向更新功能,然后更改构造函数:

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

就像有人在评论中所说的那样,如果您想改进代码,请从C 11

中了解std ::功能

只是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();
}

和finaly:

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

但这将丢失C 11方法允许的所有可能的控件 - 发明了std::functionstd::bind的原因...