2012-09-24 63 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。当我使用^%时,编译器会抱怨它,并用&替换%以继续。手动将它们更改为&效果很好。