我有一个名为 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 ++重写,它可能会传递对周围对象的引用, 不只是指向功能;这些物体自然会体现出来 所需的功能,可能还有很多)。
...
答案 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
中的正确名称空间中作弊并声明它。