将类继承为static

时间:2011-06-20 18:58:30

标签: c++ inheritance static pthreads

我在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”?

3 个答案:

答案 0 :(得分:3)

静态成员函数不适用于非静态成员,因为它们没有附加对象;他们缺少隐含的this指针,它被无形地传递给非静态成员函数。

解决这个问题的方法是显式地将指针传递给要使用的对象。您的静态函数可以访问对象的私有成员和受保护成员,因为它是类的一部分。

答案 1 :(得分:3)

sendreceive是线程,它们需要是静态的 - 没关系。但是你可以将线程转发​​给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访问对象的方法:

Calling object functions in C++ with pthreads