传递指针到声明为友元的类成员的pthread



我有一个名为BaseB的类,可以从 a 调用。

我需要有类A传递一个指针到pthread_create的成员函数在类BaseB,也恰好被声明为:

friend void ThreadedTask(BaseB* b);
类BaseB的头在public可访问性。然而,在实际的cpp文件中,它没有被声明为具有类作用域的类的成员。相反,它被声明为
void ThreadedTask(BaseB* b) { .... }

那么我如何告诉pthread_create使用friended类成员呢?

我读了c++ FAQ在第33节,它说:

因为成员函数没有要调用的对象是没有意义的如果X窗口系统是打开的,则无法直接执行此操作用c++重写,它可能会传递对周围对象的引用,不仅仅是指向函数的指针;自然,这些物体会体现出必需的功能,可能还有更多)。

? ?

如果我正确理解了您的情况,您应该有如下内容:

/*** 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
    }
};

您要么必须在BaseB.hpp的类声明之外声明ThreadedTask,要么欺骗并在A.cpp的正确命名空间中声明它。

最新更新