C++ 如何将成员函数传递给类构造函数?
我想给我的类工作者传递一个指向函数的指针,但是当我调用构造函数时出现了问题 工人C++ 如何将成员函数传递给类构造函数?,c++,function-pointers,C++,Function Pointers,我想给我的类工作者传递一个指向函数的指针,但是当我调用构造函数时出现了问题 工人 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::W
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();
}
这就是我想做的。。。
工作者应该执行任何函数的函数调用。
(更新是没有属性的空白,不是静态或常量等)
Main.cpp:
_worker = new Worker(someClass->Update());
首先,当函数是类的非静态成员函数时,它的第一个参数是调用它的对象 在您的示例中,对象
someClass
中函数Update()
的实际代码是“void Update(&someClass)”
其次,当您执行Update()
时,您调用该函数,并在工作者
构造函数中获取其返回值
要使用成员函数指针,语法为:&ClassType::FunctionName
要使用“普通”函数指针,语法为:&FunctionName
例如,在您的示例中,您可以将Update函数转换为static,并按如下方式更改构造函数:
_worker = new Worker(&someClassType::Update);
正如有人在评论中所说,如果您想改进代码,请首先从C++11了解std::function,当函数是类的非静态成员函数时,它的第一个参数是调用它的对象 在您的示例中,对象
someClass
中函数Update()
的实际代码是“void Update(&someClass)”
其次,当您执行Update()
时,您调用该函数,并在工作者
构造函数中获取其返回值
要使用成员函数指针,语法为:&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-ish风格,即良好的旧void*
类型:
void someClassUpdateWrapper(void *obj) {
SomeClassType someClass = static_cast<SomeClassType *>(obj);
someClass->Update();
}
然后:
最后:
_worker = new Worker(someClassUpdateWrapper, static_cast<void *>(someClass));
\u worker=new worker(someClassUpdateWrapper,static_cast(someClass));
但是这会使C++11方式所允许的所有可能的类型控制都失去——这就是为什么
std::function
和std::bind
被发明的原因……只是Félicie答案的一个变体
如果希望能够传递对任意对象进行操作的方法,C++11的方法将是使用std::function
和std::bind
如果出于任何原因,您必须使用C++11之前的系统,您将不得不恢复到传递任意参数的C-ish风格,即良好的旧void*
类型:
void someClassUpdateWrapper(void *obj) {
SomeClassType someClass = static_cast<SomeClassType *>(obj);
someClass->Update();
}
然后:
最后:
_worker = new Worker(someClassUpdateWrapper, static_cast<void *>(someClass));
\u worker=new worker(someClassUpdateWrapper,static_cast(someClass));
但是这会使C++11方式所允许的所有可能的类型控件都失效-这就是为什么
std::function
和std::bind
被发明的原因…您可能想了解和。至于您的问题,您调用Update
函数。您不会将函数传递给构造函数,而是传递其结果。您可能希望了解和。至于您的问题,请调用Update
函数。您不会将函数传递给构造函数,而是传递其结果。