【问题标题】:VC++ Passing Platform::String^ by refVC++ 通过 ref 传递 Platform::String^
【发布时间】:2012-09-16 05:16:31
【问题描述】:

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

【问题讨论】:

  • 究竟是什么没有按照您想象的方式工作?
  • 我想通过 ref 传递字符串。如果您查看第 1-2 行,则会在一个类上调用一个静态函数,其中一些字符串参数是 populage,_str1 和 _str2。在函数 GetStrings 中,字符串被填充并且看起来都很好。当调用返回时(第 3 行),变量 _str1 和 _str2 不再有效。为什么?
  • 这两个变量被设置为 temp,它存在于堆栈中并在函数返回时被消除>这样做的正确方法是什么?

标签: visual-c++ windows-runtime c++-cx


【解决方案1】:

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)

这些指针是输出参数:您可以写入指向的String^s,但不能从中读取。

【讨论】:

  • 感谢您的详细解释。即使这确实是一个公共 ref 类并且该方法是公共的,我也能够使用 ^&。但它是静态的。
  • 我很惊讶:我预计会出现错误 C3987:'f':公共成员的签名包含本机类型 'Platform::String^&'。您使用的是 Visual Studio 的最终版本(RTM)吗?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2016-02-26
    • 2011-04-29
    • 2011-03-25
    相关资源
    最近更新 更多