2017-03-15 43 views
1

所以我在閱讀有關Handle in C的文章,並意識到我們將句柄實現爲void指針,所以「無論」我們得到的對象/數據類型,我們可以將void指針投射到那種Object /數據並獲得它的價值。所以,我基本上有兩個問題:Handle,Void Pointer,C++中的對象

1.如果讓在下面的例子中如果我們的價值傳遞給函數dosomething(21,2,2)Handle in C

typedef void* HANDLE; 
int doSomething(HANDLE s, int a, int b) { 
     Something* something = reinterpret_cast<Something*>(s); 
     return something->doit(a, b); 
    } 

採取的說,這是否意味着價值HANDLE點爲21,如果是的話,當我們鍵入任何對象時,如何將它轉換爲該對象,是否可以使用它,如同在本例中一樣,所以在其他字中指向對象Something,something將存儲值21.

2.其次,鏈接還會顯示「因此,在您的代碼中,您只需傳遞HANDLE即可一個不透明的價值「它實際上意味着什麼?爲什麼我們要「處理」?如果有人可以給出更令人信服的使用對象的句柄示例,那將非常棒!

+0

_does意思是HANDLE指向的值是21_否,這意味着''是21.我懷疑這個內存地址有什麼有趣的地方。 – bejado

+0

我可能是錯的,但在代碼中,您將其轉換爲另一種類型。實際的地址永遠不會改變 – efekctive

回答

2

1 .:句柄是對象的標識符。由於「21」不是對象,而只是一個數字,所以你的函數調用是無效的。只有當's'指向Something類型的結構時,您的代碼纔會起作用。簡單地說,句柄只不過是指針而已,不如指向內存地址,因此「21」將被解釋爲內存地址,如果您嘗試寫入內存地址,將會導致程序崩潰。

2 .:「不透明值「意味着沒有任何使用您的代碼的開發人員無法對句柄標識的對象的內部結構進行任何假設。與指向結構的指針相比,這是一個優勢,開發人員可以查看結構並採取一些在更改代碼後不再成立的假設。 「繞過」僅僅意味着:分配給它,並把它作爲一個函數調用參數,如在:

HANDLE s = CreateAnObject(); 
DoSomethingWithObject(s); 
HANDLE t = s; 

順便說一句:在實際的代碼,你應該給句柄到你的對象不同名稱,如EMPLOYEE_HANDLE,ORDER_HANDLE等。 句柄的一個典型示例是Windows中的窗口句柄。它們識別窗口,但沒有提供有關操作系統中「窗口」內存結構如何構建的任何信息,因此,Microsoft能夠更改此內部結構,而不會因爲更改「窗口」結構而破壞其他開發人員的代碼。

+0

這個很好解釋了很多。偉大的學習材料! –

1

如果我們傳遞的價值函數DoSomething的(21,2,2),這是否意味着價值HANDLE分是21,

號這只是意味着,void*的價值是21.如果將21作爲指向Something類型對象的指針的值,它很可能會導致未定義的行爲。

2.其次,鏈接還說:「所以在你的代碼中,你只是將HANDLE作爲一個不透明的值傳遞」它實際上意味着什麼?爲什麼我們要「處理」?如果有人可以給出更令人信服的使用對象的句柄示例,那將非常棒!

手柄是不透明的,因爲您無法通過它看到任何東西。如果句柄由void*表示,則無法取消有關該對象的任何內容,因爲void*無法取消引用。如果句柄由int(作爲代碼中其他位置定義的某個數組的索引)表示,則無法查看句柄的值並確定相應對象所代表的內容。

理解句柄的唯一方法是使用適合於句柄類型的方法將其轉換爲指針或引用。

在處理由void*代表的情況下,您發佈的代碼說明了如何提取指向具體對象的指針並理解該對象。

在手柄由int表示的情況下,您可能會看到沿着線的東西:

int doSomething(HANDLE s, int a, int b) { 

    // If the value of s is 3, something will be a reference 
    // to the fourth object in the array arrayOfSomethingObjects. 

    Something& something = arrayOfSomethingObjects[s]; 
    return something.doit(a, b); 
} 
+0

它很有意義,但是請你詳細說明什麼是Something&something = arrayOfSomethingObjects [s];手段?這是否意味着如果s爲3,那麼在一個對象類型的數組中,請查看它在3處引用哪個對象,並將Something的類型分配給某個東西? –

+0

@ GENIVI-LEARNER,我稍微更新了答案。當你使用'東西&',你正在創建一個參考,而不是一個副本。 –

1

我沒有意識到有上處理一個事實上的文章或實行事實上的方式他們。他們通常是一個窗口構造,可以通過任何方式實施,從1985年開發者決定實施它們。

它真的有儘可能多的含義爲「啄」,或者說「啄可以用來獲取資源」

不要進入創建自己的「處理」的習慣,一定不要嘗試以模仿1985年的代碼習語。無效指針,reinterpret_casts和HANDLE是你應該儘可能避免的所有事情。

您唯一需要處理「HANDLE」的時候是使用Windows API,在這種情況下文檔會告訴您如何處理它。在現代C++中,如果要傳遞對象,請使用引用,指針和智能指針(包括unique_ptr,shared_ptr,weak_ptr),並研究哪些方案需要哪些方法。

+0

thingy這個詞解釋了很多原因,Handle有點令人困惑!謝謝! –