将指针施放为成员函数作为C函数的指针是一个好习惯吗?
Is it good practice to cast a pointer to a member function as a pointer to a C function
此代码编译(带有G (GCC)6.3.1),似乎是"工作"。但是我非常怀疑它是否构成良好练习。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
class ThreadObj
{
public:
void *memberFunction(void*);
void startThread(void);
static int w;
};
int ThreadObj::w = 13;
void* ThreadObj::memberFunction(void*)
{
w = 17;
return 0;
}
void ThreadObj::startThread(void)
{
void * (*p)(void *) = *((void * (*)(void *))&ThreadObj::memberFunction);
pthread_t tid;
if (pthread_create(&tid, 0, p, this) == 0)
pthread_detach(tid);
}
int main(int argc, char *argv[] )
{
ThreadObj thr;
thr.startThread();
return 0;
}
将构件函数的指针施放为指向C函数的指针并传递this
,因为数据似乎依赖于编译器如何选择解释/编译此函数的怜悯。
之前已经涵盖过,但没有明确回答。
如何打破此示例?
旧方法(带有最近的语法)是:
class ThreadObj
{
public:
void memberFunction() { w = 17;}
void startThread() {
pthread_t tid;
if (pthread_create(&tid, 0, &Func, this) == 0) {
pthread_detach(tid);
}
}
static void* Func(void* p) {
auto* that = static_cast<ThreadObj*>(p);
that->memberFunction();
return nullptr;
}
private:
int w = 13;
};
但是在C 11中,std::thread
具有更好的接口。
不是真的。这是不确定的行为。虽然很可爱。它是否工作在空中有点升起。我的猜测是通常会。
代码的作者正在利用this
通常作为成员函数实现的第一个参数。
使用指针指向Classe的方法非常有用,对我而言,这是一个很好的做法,因为它允许您实现另一种模式,例如:触发事件,通过Severas类触发事件具有相同的方法原型。
回答您的问题:这是设计问题,以及如何对您的目标有用。
我共享一个代码,在其中创建拖曳线程在同一类的方法上不同,希望您能为您提供帮助。
https://github.com/jorgemedra/c-11-threads/blob/master/readme.md
相关文章:
- QMetaObject invokeMethod的基于函数指针的语法
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- c++r值引用应用于函数指针
- 模板函数指针和lambda
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 带有类的函数指针
- () 函子后面的括号,而不是函数指针?
- 全局作用域中函数指针的赋值
- 使用"Task"函数指针队列定义作业管理器
- 将成员函数指针作为参数传递给模板方法
- 如何创建对象函数指针C++映射?
- 匹配函数指针作为模板参数?
- 通过函数指针定义类范围之外的方法
- 存储在类中的函数指针
- C++从函数指针数组调用函数
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 整数键映射到头文件中的成员函数指针
- 从类成员函数到类 C 函数指针的转换
- 如何将内联匿名函数分配给C++函数指针
- 将字符缓冲区强制转换为函数指针