将指针传递给声明为friend的类成员的pthread

时间:2011-10-14 19:01:37

标签: c++ linux pthreads

我有一个名为 BaseB 的课程,可以从 A 调用。

我需要让类 A 传递指向 BaseB 中成员函数的 pthread_create 的指针,该指针也恰好声明为:

friend void ThreadedTask(BaseB* b);

public辅助功能下的 Class BaseB的标头中。但是,在实际的cpp文件中,它不会被声明为具有类范围的该类的成员。相反,它被声明为

void ThreadedTask(BaseB* b) { .... }

那么如何告诉pthread_create使用friended班级成员?

我读了C++ FAQ in Section 33并说:

  

因为没有要调用的对象,成员函数就没有意义   它,你不能直接这样做(如果X Window系统是   用C ++重写,它可能会传递对周围对象的引用,   不只是指向功能;这些物体自然会体现出来   所需的功能,可能还有很多)。

...

2 个答案:

答案 0 :(得分:2)

如果我理解你的情况,你会得到以下内容:

/*** baseb.hpp ***/
class BaseB {
    friend void ThreadedTask(BaseB* b);

public:
    // ...
};

/*** baseb.cpp ***/
#include "baseb.hpp"
void ThreadedTask(BaseB* b) {
    // impl
}
// other BaseB definitions

/*** a.hpp ***/
struct A {
    void somefunc();
};

/*** a.cpp ***/
#include "a.hpp"
#include "baseb.hpp"
struct A {
    void somefunc() {
        // pass ThreadedTask to pthread_create
        // but where is ThreadedTask declared?
    }
};

缺少的是ThreadedTask的可见声明。

要么在baseb.hpp中显示声明,因为它现在实际上是BaseB的公共实现细节:

/*** baseb.hpp ***/
class BaseB;
void ThreadedTask(BaseB* b);

class BaseB {
    friend void ThreadedTask(BaseB* b);

public:
    // ...
};

或者让A单独声明它,因此声明可以保持“隐藏”:

/*** a.cpp ***/
#include "a.hpp"
#include "baseb.hpp"

void ThreadedTask(BaseB* b);

struct A {
    void somefunc() {
        // pass ThreadedTask to pthread_create
    }
};

答案 1 :(得分:1)

您必须在ThreadedTask中声明BaseB.hpp外部类声明,或者在A.cpp中的正确名称空间中作弊并声明它。