繁体   English   中英

将成员函数的指针转换为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作为数据传递, this似乎取决于(TOO MUCH)编译器选择如何解释/编译该对象。

之前已经对此进行了介绍,但没有给出明确的答案。

如何打破这个例子?

旧方法(使用最新语法)是:

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一般传递进来的第一个参数的成员函数的实现。

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

回答您的问题:这是设计问题,它将如何对您的目标有用。

我与您共享一个代码,在该代码中我可以在同一类的不同方法上创建拖曳线程,希望您能对您有所帮助。

https://github.com/jorgemedra/C-11-Threads/blob/master/README.md

暂无
暂无

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

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