我在这里缺少什么?我认为^是一个智能指针,我可以通过ref将字符串传递给函数。其他帽子对象怎么样?
// 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 :(得分:8)
T^
类似于指针类型;如果你有一个T^
参数的函数(比如你的GetStrings
静态成员函数),则会按值传递,就像指针传递一样值
如果您想通过引用传递String^
,则需要使用引用:
void MyClass::GetStrings(String^& str1, String^& str2)
请注意,引用是C ++语言功能,不属于Windows运行时类型系统。 Windows运行时类型系统也不支持通过引用参数输入/输出;只支持out参数。
因此,如果MyClass
是公共Windows运行时引用类型,GetStrings
是公共或受保护的成员函数(基本上,如果MyClass::GetStrings
出现在元数据中并且可以跨Windows运行时调用ABI),你需要使用指针:
void MyClass::GetStrings(String^* str1, String^* str2)
这些指针是out参数:你可以写入指向String^
但你无法读取它们。
答案 1 :(得分:1)
事实证明我必须使用^&作为函数签名中的参数类型。 ^%是CLI的一部分,但我使用的是CX。当我使用^%编译器会抱怨它并用&替换%继续前进。手动将它们更改为&工作得很好。