簡體   English   中英

取消引用一個void指針數組

[英]Dereferencing an array of void pointers

假設我有一個指向不同類型對象的void指針數組,我想通過一個函數傳遞它們並將它們轉換為各自類型的指針,我將如何進行此操作? 我已經嘗試過這個當前代碼,但是我收到錯誤:

'void *'不是指向對象的指針類型

objectA myObjectA;
objectB myObjectB;
objectC myObjectC;
objectD myObjectD;

void *data[4];

data[0] = static_cast<void *>( &myObjectA );
data[1] = static_cast<void *>( &myObjectB );
data[2] = static_cast<void *>( &myObjectC );
data[3] = static_cast<void *>( &myObjectD );

void dereference( void *data )
{
    objectA *objA_ptr = static_cast<objectA *>( data[0] );
    objectB *objB_ptr = static_cast<objectB *>( data[1] );
    objectC *objC_ptr = static_cast<objectC *>( data[2] );
    objectD *objD_ptr = static_cast<objectD *>( data[3] ); 
}

有誰知道實現這個的正確方法?

編輯:對於上下文,我正在使用opencv並嘗試使用軌跡欄創建一個簡單的gui界面。 Opencv允許將userdata輸入到TrackbarCallback中,當移動滑塊時調用它,但只能以void指針的形式調用。

 int createTrackbar( const string& trackbarname, const string& winname,
                           int* value, int count,
                           TrackbarCallback onChange=0,
                           void* userdata=0); 

假設我有一個void指針數組

void deference( void *data )

這不是一個void指針數組,它是一個單獨的void指針。

將其更改為void ** ,然后因為你要混合使用C和C ++樣式,為什么不使用C樣式轉換呢?

objectA *objA_ptr = (objectA *) data[0];
  1. 從同一個基類派生所有這些。

  2. 如果您的函數需要刪除它們,則將析構函數設置為虛擬。

  3. 使你的數組BaseClass *data[4]

  4. 使你的函數void deference(BaseClass **data)

您可以使用reinterpret_cast<>()而不是static_cast<>

需要正確的函數原型

void dereference(void **data)

因為你傳遞的是一個void *數組,而且我們都知道在C和C ++中,在大多數情況下,數組表達式會被指針表達式替換。

是否有任何特殊原因必須使用指向不同類對象的指針數組? 這聞起來像是C ++問題的C解決方案。

暫無
暫無

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

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