【问题标题】:C++ Inheritance and Pthreads with Virtual Worker FunctionsC++ 继承和具有虚拟工作者函数的 Pthreads
【发布时间】:2013-07-11 04:50:16
【问题描述】:

我有一个类,我正试图将其实现为抽象类,以最大限度地重用代码。然而,两个派生类之间的主要共同点在于每个派生类都有一个消费者和生产者线程。我想知道是否可以让每个静态成员函数调用一个虚拟成员函数来完成所有底层工作。

基本上,是否允许以下​​代码,或者我是否在做一些超级 hacky 的事情,或者编译器会对我大喊大叫?

// in AbstractClass.h
class AbstractClass {
  // some code here including constructors/destructors
 protected:
  virtual int Worker() = 0;  // derived class provides implementation
 private:
  static void* Thread(void* args);
};

// in AbstractClass.cpp
static void* AbstractClass::Thread(void* args) {
  AbstractClass myobject = static_cast<AbstractClass*>(args);
  myobject->Worker();
}

基本上我想知道派生类“worker”是否会以这种方式调用?请注意,p_thread_create() 是通过传入 Thread() 函数来调用的。

感谢您的帮助,因为我试图提高对继承和虚函数的理解,以及如何使用它来最大限度地重用代码。

【问题讨论】:

  • 编译器不会大喊大叫,它会看到静态转换并假设您知道自己在做什么。考虑使用类型更安全的 C++11 线程。
  • @n.m.我到了,我保证!我只是想暂时使用 p_threads,因为我想很好地掌握底层的魔法。

标签: c++ inheritance pthreads virtual


【解决方案1】:

是的,代码看起来不错,您的假设是正确的。虚函数的目的是,无论在哪个超类签名上调用该方法,都会调用一个函数的最派生版本。

使用 pthreads 和 C++,您使用的方法是完全合理的,而不是 hackey。但是,我会在包含静态类方法的单独类中创建线程。这将阻止线程在派生类中混在一起。

struct ThreadManager
{
  ThreadManager(AbstractWorker* worker)
  {
     mWorker = worker;
     mThread = ThreadStart(threadFunc, this); /* made up thread code :) */
  }
  ~ThreadManager()
  {
     ThreadStop(mThread);
  }

  static void* threadFunc(void* args)
  {
     ThreadManager* manager = static_cast<ThreadManager*>(args);
     manager->mWorker->Work();
  }

  AbstractWorker* mWorker;
  Thread mThread;
}

请注意,当使用 pthreads 时,实际上需要一个静态函数。

【讨论】:

  • 这是我的难题...如果我在派生类中创建线程,我将丢失很大一部分将在派生类之间共享的代码。因此,我真的失去了拥有抽象类的理由。
  • @It'sPete 我将说明。 - 答案已更改 - 制作一个使用抽象接口的单独具体对象。
  • @It'sPete BTW 你可能没有意识到,但是静态函数实际上是pthreads需要的。你不能拥有一个指向虚函数的普通函数指针,并期望它像虚函数一样工作。
猜你喜欢
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-23
  • 2017-12-05
  • 2015-06-21
  • 1970-01-01
相关资源
最近更新 更多