繁体   English   中英

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

[英]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::functionstd::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::functionstd::bind的原因...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM