3

我在这里想念什么?我认为 ^ 是一个智能指针,我可以通过 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
}
4

2 回答 2

10

AT^类似于指针类型;当你有一个带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^s,但不能从中读取。

于 2012-09-24T21:39:04.840 回答
1

事实证明,我必须使用 ^& 作为函数签名中的参数类型。^% 是 CLI 的一部分,但我使用的是 CX。当我使用 ^% 时,编译器会抱怨它并用 & 替换 % 以继续。手动将它们更改为并且效果很好。

于 2012-09-24T23:23:42.797 回答