Наследовать класс как статический - PullRequest
0 голосов
/ 20 июня 2011

У меня есть следующая структура в 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*);
}

Эти функции «отправить» и «получить» работают на «а». Но нестатический член не может быть отредактирован в статической функции. Поскольку send и receive являются потоками, следовательно, они должны быть определены как статические. У меня был бы только 1 объект класса B, хотя есть несколько объектов класса A.

Итак, есть ли способ каким-либо образом использовать «a» в «send» и «receive»?

Ответы [ 3 ]

3 голосов
/ 20 июня 2011

Статические функции-члены не работают на нестатических членах, потому что к ним не прикреплен объект; в них отсутствует неявный указатель this, который незаметно передается в нестатические функции-члены.

Способ обойти это - явно передать указатель на объект для работы. Ваша статическая функция будет иметь доступ к закрытым и защищенным членам объекта, потому что она является частью класса.

3 голосов
/ 20 июня 2011

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. В этом случае вы можете выделить данную структуру в куче (предпочтительно) и передать эту структуру send нить.

В функции send, используя этот флаг, вы можете определить, имеет ли базовый указатель тип A или B, и вызвать нестатическую функцию соответствующего класса.

2 голосов
/ 20 июня 2011

"a" является членом объекта типа "A" .

Это означает, что вам нужно иметь экземпляр A для доступа a .

Поэтому, если вы не сделаете его статичным, вам нужно будет создать объект типа A (или B *).1016 *) и передать его в качестве параметра функциям.

Кроме того, вы можете получить доступ к методу объекта с помощью pthreads:

Вызов функций объекта в C ++ с помощью pthreads

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...