c++ - 如何使用专用线程类MyThreadClass

标签 c++ class polymorphism pthreads

我喜欢这篇文章中的 MyThreadClass:pthread function from a class并想在我的类里面使用它,但我正在努力弄清楚,我现在拥有的是:

#include <pthread.h>
#include <iostream>
#include <vector>
#define OK      0
#define ERROR   -1

//-- ThreadClass
class MyThreadClass
{
public:
   MyThreadClass() {/* empty */}
   virtual ~MyThreadClass() {/* empty */}

   /** Returns true if the thread was successfully started, false if there was an error starting the thread */
   bool StartInternalThread()
   {
      return (pthread_create(&_thread, NULL, InternalThreadEntryFunc, this) == 0);
   }

   /** Will not return until the internal thread has exited. */
   void WaitForInternalThreadToExit()
   {
      (void) pthread_join(_thread, NULL);
   }

protected:
   /** Implement this method in your subclass with the code you want your thread to run. */
   virtual void InternalThreadEntry() = 0;

private:
   static void * InternalThreadEntryFunc(void * This) {
       ((MyThreadClass *)This)->InternalThreadEntry(); return NULL;
       }

   pthread_t _thread;
};
//-- /ThreadClass
//--- DUMMY DECLARATIONS BELOW TO MAKE IT COMPILE ---//
#define LOG_NS_ERROR std::cout
class test{
    public:
        int get_child(std::string x){return OK;};
};
test *_global;
typedef struct test_struct{} _db_transact;
class db_transact{
    public: 
        db_transact(int,int&,int&){};
};
int _ns;
int _log_id;
//--- DUMMY DECLARATIONS ABOVE TO MAKE IT COMPILE ---//
class db_c_hndlr : public MyThreadClass{
    public: 
        db_c_hndlr(void);
        ~db_c_hndlr(void);
        db_transact *db_conn_get(void);
        void InternalThreadEntry(void *func);
    private:
        int _stop;
        std::vector<db_transact*> _db_pool;
};
//---------------------------------------------------------

db_c_hndlr::db_c_hndlr(void) {
}
//---------------------------------------------------------

void db_c_hndlr::InternatThreadEntry(void *func) {

    while(!stop){
        std::cout << "going!" << std::endl;
        sleep(1);
    }
}
//---------------------------------------------------------

db_c_hndlr::~db_c_hndlr() {
    int i = 0;
    std::vector<db_transact*>::iterator it;
    for (i=0, it = _db_pool.begin();it!=_db_pool.end();it++, i++) {
        if (_db_pool[i])
            if (_db_pool[i]!=NULL) 
                delete _db_pool[i];
    }
}
//---------------------------------------------------------

db_transact *db_c_hndlr::db_conn_get(void) {
    db_transact *tmp;

    tmp = new db_transact(_global->get_child("db_config"), _ns, _log_id);
    _db_pool.push_back(tmp);
    return tmp;
}
//---------------------------------------------------------
int main(void)
{
    db_transact *conn=NULL;
    db_c_hndlr db;
    //db = new db_c_hndlr();

    conn= db.db_conn_get();
    return OK;
}

但我得到的编译器消息如下所示:

$ g++ -lpthread pseudo_code.cpp 
pseudo_code.cpp:70:48: error: no ‘void db_c_hndlr::InternatThreadEntry(void*)’ member function declared in class ‘db_c_hndlr’
 void db_c_hndlr::InternatThreadEntry(void *func) {
                                                ^
pseudo_code.cpp: In function ‘int main()’:
pseudo_code.cpp:101:16: error: cannot declare variable ‘db’ to be of abstract type ‘db_c_hndlr’
     db_c_hndlr db;
                ^
pseudo_code.cpp:54:7: note:   because the following virtual functions are pure within ‘db_c_hndlr’:
 class db_c_hndlr : public MyThreadClass{
       ^
pseudo_code.cpp:29:17: note:    virtual void MyThreadClass::InternalThreadEntry()
    virtual void InternalThreadEntry() = 0;

我正在努力弄清楚如何让它工作。

最佳答案

所提供的代码中有两个错误导致报告的错误。

  1. InternatThreadEntry 不是 db_c_hndlr 的成员,因为 db_c_hndlr 声明了 InternalThreadEntry。这只是一个简单的错字:Internat != Internal

  2. db_c_hndlr 是一个抽象类,因为 MyThreadClass 中声明的纯虚函数 InternalThreadEntry 没有参数。

virtual void InternalThreadEntry() = 0;

is not implemented by

void InternalThreadEntry(void *func)

db_c_hndlr 中。看起来应该不需要 void *func,所以我会通过删除参数来解决这个问题。

无关:您可能会发现 std::thread更加通用和便携。

关于c++ - 如何使用专用线程类MyThreadClass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52463021/

相关文章:

c++ - 位和 : keyword vs function in C++

c++ - 如何在 CRTP 实现中传递基类指针

c++ - 来自基类的复制构造函数

python - 在类内的多边形内创建随机点

python - 如何使装饰器函数成为类的一部分

c++ - 基类对派生类指针的引用

c++ - 强制子类在C++中实现某个构造函数原型(prototype)

c++ - 不使用尖括号的模板 - 重载?

C++ 虚拟析构函数和内存泄漏

c# - 我可以在 C++ 中创建一个类似于 C# 的全局命名空间层次结构来帮助开发人员使用我们的代码吗?