我在C ++中有以下结构:
class A
{
protected:
int a;
};
class B : public A
{
public:
static void initThreads(); //Initialize threads (pthreads)
/* Threads */
static void* send(void*);
static void* receive(void*);
}
这些“发送”和“接收”功能在“a”上运行。但是无法在静态函数中编辑非静态成员。因为发送和接收是线程,因此需要将它们定义为静态。虽然有多个A类对象,但我只有1个B类对象。
那么,有没有办法以某种方式在“发送”和“接收”中使用“a”?
答案 0 :(得分:3)
静态成员函数不适用于非静态成员,因为它们没有附加对象;他们缺少隐含的this
指针,它被无形地传递给非静态成员函数。
解决这个问题的方法是显式地将指针传递给要使用的对象。您的静态函数可以访问对象的私有成员和受保护成员,因为它是类的一部分。
答案 1 :(得分:3)
send
和receive
是线程,它们需要是静态的 - 没关系。但是你可以将线程转发给B类本身:
class B
{
public:
static void* send(void* param)
{
// param is of B*
B* pThis = (B*)param;
pThis->send_impl();
return (void*)0;
}
void send_impl() { /* Use 'this'*/ }
};
当然,您需要将有效的B *传递给send
函数。
或者你有一个可以容纳A *的结构,并且一些提到该对象的标志是A或B.在这种情况下,你可以在堆上分配给定的结构(最好),并将该结构传递给{{ 1}}线程。
在send
函数中,使用该标志,可以确定底层指针是否为A或B类型,并调用适当类的非静态函数。
答案 2 :(得分:2)
“a”是“A”类型的对象的成员。
这意味着您需要有 A 的实例才能访问 a 。
因此,除非您将其设置为静态,否则您需要创建 A (或 B )类型的对象,并将其作为参数传递给函数。
此外,您可以使用pthreads访问对象的方法: