如何将成员函数传递给类构造函数
How to pass a member function to a class constructor?
我想通过我的班级工人一个指针指向效果,但是当我调用构造函数时出了问题...
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
只是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();
}
和finaly:
_worker = new Worker(someClassUpdateWrapper, static_cast<void *>(someClass));
但这将丢失C 11方法允许的所有可能的控件 - 发明了std::function
和std::bind
的原因...
相关文章:
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 构造函数/函数声明参数列表中的统一初始化
- 在c++中为链接列表创建复制构造函数/函数
- 如何声明模板函数,以便可以在类构造函数/函数中传递
- 在C 中,如何调用构造函数函数
- 在C++中构造模板函数时出现编译错误 C2664 和 C2440
- Rcpp:构造模板函数
- 采用nulltpr_t的构造函数:函数定义不声明参数
- 使用基于模板的构造函数构造std::函数
- 构造函数:函数不接受3个参数
- 就地构造 std::函数目标
- 将字符串构造作为函数参数传递
- C++:从模板化方法构造std::函数
- 构造std::函数的向量时出现编译器错误
- 构造<stl_hashtable>函数参数是否在
- libstdc++和libc++在用lambda构造std::函数时的不同行为
- 编译器构造-带有函数的类的c++sizeof()
- 使用 c++11 构造映射函数
- 调用构造与函数原型混淆
- 在不调用initializer_list构造函数的情况下,将不可复制、不可移动的类型构造为函数形参