2012-09-24 59 views
1

我在這裏丟失了什麼?我認爲^是一個智能指針,我可以通過引用傳遞一個函數。其他帽子物品呢?VC++通過Platform :: String ^參考

// calling code 
MyClass::GetString(_str1, _str2); 
// both strings are nullptr at this point 

/* static */ 
MyClass::GetStrings(String^ str1, String^ str2) 
{ 
    // Read from Local Settings 
    auto value = localSettings->Values->Lookup(kKey); 
    String^ temp = ref new String(value->ToString()->Data()); 
    str1 = temp; 

    // same for str2 
} 
+0

究竟是不是在你認爲的方式工作? –

+0

我想通過ref傳遞字符串。如果你看第1-2行,一個靜態函數在一個類中被調用,其中一些字符串參數爲_str1和_str2。 在函數GetStrings中,字符串被填充並且看起來都很好。當調用返回時(第3行),變量_str1和_str2不再有效。爲什麼? – VaporwareWolf

+0

這兩個變量被設置爲臨時值,這是生活在堆棧上,並在函數返回時被刪除>什麼是正確的方法來做到這一點? – VaporwareWolf

回答

7

A T^與指針類型相似;當您具有T^參數的功能(例如您的GetStrings靜態成員函數)時,帽子通過值傳遞,就像指針通過值以值傳遞一樣。

如果您想通過引用傳遞的String^的,你需要使用引用:

void MyClass::GetStrings(String^& str1, String^& str2) 

注意引用是一個C++語言特性,但它們不是Windows運行時類型系統的一部分。 Windows運行時類型系統也不支持通過引用參數進/出;只有輸出參數被支持。

因此,如果MyClass是一個公共Windows運行時引用類型和GetStrings是一個公共或受保護的成員函數(基本上,如果MyClass::GetStrings出現在元數據,並且可以應用於Windows運行時ABI調用的),你需要使用指針:

void MyClass::GetStrings(String^* str1, String^* str2) 

這些指針是輸出參數:您可以寫入指向的String^,但您無法讀取它們。

+0

感謝您的詳細解釋。我能夠使用^,儘管這確實是一個公共參考類,而且方法是公開的。這是靜態的。 – VaporwareWolf

+0

我很驚訝:我期待錯誤C3987:'f':公共成員的簽名包含本機類型'Platform :: String ^&'。您是否正在使用Visual Studio(RTM)的最終版本? –

1

事實證明,我必須使用^ &作爲函數簽名中的參數類型。 ^%是CLI的一部分,但我使用CX。當我使用^%時,編譯器會抱怨它,並用&替換%以繼續。手動將它們更改爲&效果很好。