C++ 数组和 System::Single?
C++ arrays and System::Single?
我是 C++ 的新手,我正在尝试在 class 中获取一个数组,并将其设置为等于传入的数组。
public ref class Example {
array<float> ^ myarray1 = gcnew array<float>(3);
public:
Example(float^ myarray2) {
int i = 0;
while (i<3) {
myarray[i] = myarray2[i];
i += 1;
}
}
在main函数中,构造函数调用如下:
float myarray2[] = {1,2,3};
Example ^example1 = gcnew Example(*myarray2)
我得到的错误如下:
- System::Single' 没有默认索引 属性(class 索引器)
- 表达式必须有指向对象的指针或指向 C++/CLI 数组的句柄
类型
这两个错误都被确定为发生在我说 myarray[i] = myarray2[i] 的地方。
对于解决此问题的任何帮助,我将不胜感激。我看不到 System::Single 在哪里或如何作为错误消息被拉入。而且,在建议之前,我知道我可以开始将 myarray2 设置为像 myarray1 一样的数组浮点数,但我希望它能够将 myarray2 作为 float^ myarray2.
既然你说你是 C++ 的新手,那么让我指出你不是在那里编写经典的 C++。您正在编写框架的C++/CLI, which is a set of language extensions to C++ designed to interoperate with the CLI (.NET Framework). Because of this, the type float
in your code is an alias for the type System::Single
。
关于索引器问题,错误消息几乎清楚地说明了允许您使用索引器的情况:
System::Single' has no default indexed property (class indexer)
如果类型具有已定义的索引 属性,则可以使用索引器。 System::Single
,也称为 float
,恰好没有。
expression must have pointer-to-object type
如果类型是非void
指针类型,您可以使用索引器。您必须这样声明:
Example(float* myarray2) {
在这种情况下,myarray2[i]
等同于表达式 *(myarray2 + i)
。
or handle-to-C++/CLI-array type
如果类型是 C++/CLI array
类型的句柄 (^
),则可以使用索引器。如您所知,您必须这样声明:
Example(array<float> ^ myarray2) {
底线是,尽管您可以将 float*
(指向 float
的指针)视为 float
的 C 样式数组(作为C 和 C++ 关于数组和指针运算),这些东西根本不适用于 float^
(float
的句柄)类型(这是 C++/CLI 特定的)。
Example(float^ myarray2)
这并不代表您认为的那样。你习惯了 C 语言的行为,一个 float[] 可以自动衰减到一个 float* 到数组的第一个元素。有点不幸的是也继承到了 C++ 中。
但不是 C++/CLI,它基本上是 无法验证的 代码。并负责大量的错误和安全问题。一个核心问题是您的构造函数不知道数组中存储了多少元素。您硬编码了“3”,但如果调用者传递了一个更小的数组,那么就会发生非常糟糕的事情。
实际上的意思是"reference to a boxed copy of a System::Single"。编译器试图理解这一点,不可避免地开始变得 非常 混淆你下一步要做什么。就像使用 [] 运算符一样,这需要类型具有索引器。花车没有。
您需要:
Example(array<float>^ myarray2)
这是安全可验证的,不能越界索引数组。而且您不必再对“3”进行硬编码,只需使用 myarray2->Length 即可。而且您(通常)不再拥有数组的副本,只需分配 myarray1。您将通过传递 gcnew array<float> { 1, 2, 3 }
来调用构造函数。
或:
Example(float* myarray2)
它的工作方式与在 C 和 C++ 中的工作方式一样。如果你想用那个 float[] 调用构造函数,则需要。不可验证,你需要那个神奇的“3”。请考虑添加一个额外的参数来传递数组长度。
我是 C++ 的新手,我正在尝试在 class 中获取一个数组,并将其设置为等于传入的数组。
public ref class Example {
array<float> ^ myarray1 = gcnew array<float>(3);
public:
Example(float^ myarray2) {
int i = 0;
while (i<3) {
myarray[i] = myarray2[i];
i += 1;
}
}
在main函数中,构造函数调用如下:
float myarray2[] = {1,2,3};
Example ^example1 = gcnew Example(*myarray2)
我得到的错误如下:
- System::Single' 没有默认索引 属性(class 索引器)
- 表达式必须有指向对象的指针或指向 C++/CLI 数组的句柄 类型
这两个错误都被确定为发生在我说 myarray[i] = myarray2[i] 的地方。
对于解决此问题的任何帮助,我将不胜感激。我看不到 System::Single 在哪里或如何作为错误消息被拉入。而且,在建议之前,我知道我可以开始将 myarray2 设置为像 myarray1 一样的数组浮点数,但我希望它能够将 myarray2 作为 float^ myarray2.
既然你说你是 C++ 的新手,那么让我指出你不是在那里编写经典的 C++。您正在编写框架的C++/CLI, which is a set of language extensions to C++ designed to interoperate with the CLI (.NET Framework). Because of this, the type float
in your code is an alias for the type System::Single
。
关于索引器问题,错误消息几乎清楚地说明了允许您使用索引器的情况:
System::Single' has no default indexed property (class indexer)
如果类型具有已定义的索引 属性,则可以使用索引器。
System::Single
,也称为float
,恰好没有。expression must have pointer-to-object type
如果类型是非
void
指针类型,您可以使用索引器。您必须这样声明:Example(float* myarray2) {
在这种情况下,
myarray2[i]
等同于表达式*(myarray2 + i)
。or handle-to-C++/CLI-array type
如果类型是 C++/CLI
array
类型的句柄 (^
),则可以使用索引器。如您所知,您必须这样声明:Example(array<float> ^ myarray2) {
底线是,尽管您可以将 float*
(指向 float
的指针)视为 float
的 C 样式数组(作为C 和 C++ 关于数组和指针运算),这些东西根本不适用于 float^
(float
的句柄)类型(这是 C++/CLI 特定的)。
Example(float^ myarray2)
这并不代表您认为的那样。你习惯了 C 语言的行为,一个 float[] 可以自动衰减到一个 float* 到数组的第一个元素。有点不幸的是也继承到了 C++ 中。
但不是 C++/CLI,它基本上是 无法验证的 代码。并负责大量的错误和安全问题。一个核心问题是您的构造函数不知道数组中存储了多少元素。您硬编码了“3”,但如果调用者传递了一个更小的数组,那么就会发生非常糟糕的事情。
实际上的意思是"reference to a boxed copy of a System::Single"。编译器试图理解这一点,不可避免地开始变得 非常 混淆你下一步要做什么。就像使用 [] 运算符一样,这需要类型具有索引器。花车没有。
您需要:
Example(array<float>^ myarray2)
这是安全可验证的,不能越界索引数组。而且您不必再对“3”进行硬编码,只需使用 myarray2->Length 即可。而且您(通常)不再拥有数组的副本,只需分配 myarray1。您将通过传递 gcnew array<float> { 1, 2, 3 }
来调用构造函数。
或:
Example(float* myarray2)
它的工作方式与在 C 和 C++ 中的工作方式一样。如果你想用那个 float[] 调用构造函数,则需要。不可验证,你需要那个神奇的“3”。请考虑添加一个额外的参数来传递数组长度。