Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将指向成员函数的指针强制转换为指向C函数的指针是一种好的做法吗_C++_Pointers_Pthreads - Fatal编程技术网

C++ 将指向成员函数的指针强制转换为指向C函数的指针是一种好的做法吗

C++ 将指向成员函数的指针强制转换为指向C函数的指针是一种好的做法吗,c++,pointers,pthreads,C++,Pointers,Pthreads,这段代码使用g++GCC6.3.1编译,看起来可以正常工作。但我对它是否构成良好实践持怀疑态度 将指向成员函数的指针转换为指向C函数的指针并将其作为数据传递似乎过于依赖于编译器选择如何解释/编译它 这一点以前已经讨论过,但尚未得到明确回答 这个例子怎么可能被打破呢?旧的方法和最新的语法是: class ThreadObj { public: void memberFunction() { w = 17;} void startThread() { pthread_

这段代码使用g++GCC6.3.1编译,看起来可以正常工作。但我对它是否构成良好实践持怀疑态度

将指向成员函数的指针转换为指向C函数的指针并将其作为数据传递似乎过于依赖于编译器选择如何解释/编译它

这一点以前已经讨论过,但尚未得到明确回答


这个例子怎么可能被打破呢?

旧的方法和最新的语法是:

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有一个更好的接口。

不太好。这是未定义的行为。不过它很可爱。它是否有效还有点悬而未决。我的猜测是,它通常会


代码的作者利用了这样一个事实,即这通常是作为成员函数实现的第一个参数传入的。

使用指向类的方法的指针非常有用,对我来说,这是一个很好的实践,因为它允许您实现另一种模式,例如:在具有相同方法原型的几个类上触发事件

回答你的问题:这是一个设计的问题,以及它如何对你的目标有用

我和你们分享了一段代码,我在同一个类的不同方法上创建了两个线程,希望它能帮助你们


您将其标记为C,但C中没有成员函数。它被破坏,因为将指针强制转换为不同类型的函数是未定义的行为。根据定义,使用带有reinterpret_cast或等效C cast的函数指针强制转换,而不是强制转换回原始类型,都是未定义的行为。见第7条。这不是很多关于好的实践,因为它在C++中是不允许的。您可以定义一个新的静态方法,该方法接受指向类实例的指针,并改用指向该方法的函数指针。请注意,如果将其与c++11线程支持混合使用,这可能是解决问题的一个良好起点。这并不构成良好的实践。该示例在不需要对其执行任何操作的情况下被破坏——它依赖于未定义的行为。
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;
};