2012-03-13 102 views
1

說我有無效指針指向的陣列,以不同類型的對象,我想通過一個函數來傳遞他們,將它們轉換成相應的類型的指針數組,我怎麼會去這樣做?我試過這個當前的代碼,但我得到的錯誤:取消引用空指針

‘void*’ is not a pointer-to-object type

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); 
+3

我的問題是;爲什麼在這個世界上你使用'void *'呢?這是C++,你有模板。 – 2012-03-13 18:52:55

回答

7

Say I have an array of void pointer

void deference(void *data) 

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

變化,爲void **,然後因爲你混合C和C++的風格了,無論如何,爲什麼不直接使用C風格的轉換? :

objectA *objA_ptr = (objectA *) data[0]; 
3
  1. 推導它們全部來自相同的基類。

  2. 使虛析構函數,如果你的函數需要刪除它們。

  3. 讓你的陣列BaseClass *data[4]

  4. 讓你的功能void deference(BaseClass **data)

+0

或者,使用'vector '而不是數組。 – 2012-03-13 19:06:37

+0

@JohnBode ...和使用shared_ptr的,而不是把「普通」指針在矢量 – 2012-03-13 19:15:02

2

你可以使用的,而不是reinterpret_cast<>()static_cast<>

+0

如果的static_cast不起作用,那麼很明顯reinterpret_cast的只能是更錯在這裏? – UncleBens 2012-03-13 19:22:35

+0

這取決於你的意思與「不工作」。 reinterpret_cast<>它是最強大,因此最危險的演員。它的工作原理是它拋棄了所有的編譯器類型檢查,並確保「我知道我所要求的 - 做到這一點!」。 – Matthias 2012-03-13 19:28:09

+0

這很好,因爲'void *'編譯器沒有任何信息來執行任何類型檢查。 – 2012-03-14 00:00:05

0

正確的函數原型必須

void dereference(void **data) 

因爲你傳遞的void *數組,因爲我們都知道在C和C++的數組表達式替換在大多數情況下指針表達式。

有爲什麼你必須使用指針數組不同類的對象什麼特別的原因?這聽起來像C解決方案的C + +的問題。