簡體   English   中英

純虛擬方法VS。 功能指針

[英]Pure Virtual Method VS. Function Pointer

最近,我一直在設計Thread類庫,並制作了Thread抽象類,如下所示:

class Thread {
public:
    run() { /*start the thread*/ }
    kill() { /*stop the thread*/ }
protected:
    virtual int doOperation(unsigned int, void *) = 0;
};

真正的線程類將繼承此抽象類,並以其自己的邏輯實現doOperation方法,這類似於Strategy Pattern

問題是我依賴於C后端庫,該庫在以下函數中定義了運行線程:

int startThread(char* name, (int)(*)(unsigned int, void*), int, int, int, void*);

如你看到的; 第二個參數是指向線程循環(主函數)的函數指針,這就是問題所在; 由於我使用此C函數在run方法中啟動線程,因此我將doOperation的地址doOperation給第二個參數,由於類型不匹配,無法執行此操作。

我試圖使用reinterpret_cast返回一個指針,但是我ISO-C ++禁止返回未初始化函數成員的指針。 我不知道如何克服這種沖突,我猜唯一的解決方案是使用靜態方法,但這會炸毀我的設計模式!

首先,請確保閱讀Michael Burr提供的鏈接,因為該鏈接包含良好的信息。 然后,這是C ++ ish偽代碼:

int wrapperDoOperation(int v, void *ctx)
{
    Thread *thread = (Thread *)ctx;
    return thread->doOperation(v);
}

class Thread {
public:
    run() {
         startThread("bla", wrapperDoOperation, bla, bla, bla, (void *)this);
    }
    kill() { /*stop the thread*/ }
protected:
    virtual int doOperation(unsigned int) = 0;

friend wrapperDoOperation ......;
};

這個想法是doOperation作為Thread的成員函數,不需要void * context,您可以將要作為上下文傳遞的任何內容保留在對象本身中。 因此,您可以使用void指針將該指針實際傳遞給doOperation。 請注意,void *詳細信息對您的類用戶是隱藏的,這很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM