【问题标题】:Arrays of strings in Managed C++托管 C++ 中的字符串数组
【发布时间】:2009-06-15 10:38:10
【问题描述】:

我正在尝试用托管 C++ 编写应用程序,但我不知道如何声明字符串数组。

字符串^ linet[];

抛出错误

'System::String ^' : 本机数组不能包含此托管类型

所以我想对于托管数据类型有不同的方法。究竟是什么?

【问题讨论】:

  • 有点吹毛求疵:据我所知,托管 C++ 和 C++/CLI 将被编译成相同的代码,但它们实际上是两种不同的语言。

标签: c++ arrays managed managed-c++


【解决方案1】:

您真的是指托管 C++ 吗?不是 C++/CLI?

假设您实际使用的是 C++/CLI(由于您发布的错误消息),有两种方法可以做到这一点:

array<String^>^ managedArray = gcnew array<String^>(10);

将创建一个托管数组,即与 C# 中的 string[] 类型相同。

gcroot<String^>[] unmanagedArray;

将创建一个非托管 C++ 数组(我从未真正尝试过使用数组进行此操作 - 它适用于 stl 容器,因此它也应该在这里工作)。

【讨论】:

  • 调用 String->Split()(字符串数组版本)时如何工作?
  • @user645280 - 数组^ sa = str->Split(gcnew array{"one","two"}, StringSplitOptions::None);使用 spit 字符串时需要指定 StringSplitOptions。
【解决方案2】:

http://www.codeproject.com/KB/mcpp/cppcliarrays.aspx

这应该有你需要的所有答案:)

使用托管 C++(又名 C++/CLI 又名 C++/CLR)时,您需要在所做的每一件事中考虑变量类型。任何“托管”类型(基本上,从 System::Object 派生的所有内容)都只能在托管上下文中使用。一个标准的 C++ 数组基本上在堆上创建一个固定大小的内存块,大小为 (type) x NumberOfItems 个字节,然后遍历它。不能保证托管类型在堆上保持与原来相同的位置,这就是为什么你不能这样做:)

【讨论】:

  • 有点挑剔:据我所知,托管 C++ 和 C++/CLI 将被编译成相同的代码,但它们实际上是两种不同的语言。
  • From en.wikipedia.org/wiki/Managed_Extensions_for_C%2B%2B "...这些新扩展被指定为 C++/CLI 并包含在 Microsoft Visual Studio 2005 中。[1] 托管 C++ 及其所指的扩展因此已被弃用和取代通过新的扩展......” - 所以,是的,你是绝对正确的。
  • 我只提到它是因为托管 C++ 不使用句柄(托管指针,声明为 type^),但 C++/CLI 使用。 ...现在我想起来了,问这个问题的人也把两者混为一谈了。
【解决方案3】:

您使用 .Net 中的集合类。对于example

List<String^>^ dinosaurs = gcnew List<String^>();

【讨论】:

    猜你喜欢
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    相关资源
    最近更新 更多