2009-04-13 109 views
0

下面的語法是什麼意思?C++語法問題

typedef void* hMyClass; //typedef as a handle or reference 
hMyClass f = &something; 
const MyClass& foo = static_cast<MyClass&>(*f); 
foo.bar(); 

回答

2

一個的static_cast意味着該系統實際上並沒有試圖確保,當你從一個引用類型轉換爲另一種,要轉換的東西實際上是目標類型的實例(不同於動態管型) 。

因此,您告訴編譯器您足夠聰明,知道hMyClass中包含的地址以及來自某個東西的地址實際上包含MyClass的一個實例,並且您對不可預測的事情負有全部責任如果你錯了會發生。

你的「東西」是什麼類型?你也可能有一個錯誤。你可能想要一個&的東西。

1

這實際上是無效的。你正在給一個類型賦值,而不是第2行的變量。

0

void *通常用於泛型指針。

在C#這將是類似這樣的:

object o = new XmlDocument(); 

對象o =新列表();

但是,在C++中,執行的類型安全性很小。 IIRC,static_cast與(cast)相同,因爲沒有運行時類型檢查。

+0

通常模板用於泛型集合;現在有幾個地方你實際上需要空指針。空指針通常用於「匿名」類型,如句柄。通常,基於模板的解決方案在適用時是優選的。 – 2009-04-13 23:38:59

0

本質上,有人已經將一個MyClass指針存儲在一個void指針中,可能將其傳遞給回調函數。這段代碼大概是被回調過來的,正在將它重新用作MyClass。

此外,它還有語法錯誤,正如eagerwishes所指出的那樣。

0

很難說沒有更多的上下文,這個「意味着什麼」。我認爲你正在處理別人的代碼,並且你顯示的線條分散在多個函數中。

對於代碼意圖,我最好的猜測是這是一個處理第三方代碼/庫的機制。在C++中使用(非模板化)第三方庫和你自己的類型是很常見的。如果這些庫需要臨時保存您創建和擁有的數據,則即使庫不知道您的類型,也需要一種方法讓圖書館訪問您的數據。一個例子是回調/事件功能。如果一個庫會在發生事件時異步通知你,你需要給它一個函數指針和用戶定義的數據,這樣當函數被調用時,你就知道該如何處理它。庫通常爲這個用戶提供的數據提供一個void *指針。在C++中通常只傳入用戶提供的數據的對象實例,然後委託給該對象來處理回調。以下是代碼的樣子:

// 3rd-party library API 
typedef void (*PingNotifyPtr)(void*); 
void NotifyOnPing(PingNotifyPtr, void* userData); 
// User Code 
void MyNotify(void* myData) 
{ 
    MyClass* ptr = (MyClass*)myData; 
    // do something with ptr 
} 
void Main() 
{ 
    MyClass *pClass = new MyClass(); 
    NotifyOnPing(&MyNotify, pClass); 
    // the callback is now armed with all the data it needs. 
} 

許多庫通過聲明「void *」參數來實現此目的。這是一些內存位置的原始指針。任何東西都可以在這個位置,一個整數,一個類實例,一個字符串等等。第三方庫保存在那個指針上,並在某個時候返回給你的代碼。

您的示例代碼的第三行是將void *指針並將其轉換爲對類實例的引用。 C++引用就像指針,除非它們不能爲NULL,並且它們使用值語法(使用'。'運算符而不是' - >'運算符)。示例代碼的第4行然後在重構的類實例上使用一個方法。無論如何,如果代碼庫中的所有4行代碼都是連續的,那麼代碼意味着某人對C++一無所知。這裏有一個更緊湊的方式做同樣的代碼在同一行:

((const MyClass*)something)->Foo(); 

或者,如果你喜歡的值語法:

(*((const MyClass*)something)).Foo(); 

祝您好運!