我对C++相对较新,我正在尝试在类中获取一个数组,并将其设置为等于传入的数组。
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)
我得到的错误如下:
- 系统::Single' 没有默认索引属性(类索引器(
- 表达式必须具有指向对象的指针或句柄到C++/CLI 数组 类型
这两个错误都被确定为发生在我说myarray[i] = myarray2[i]的地方。
我将非常感谢解决此问题的任何帮助。我看不到系统::单身在哪里或如何作为错误消息被拉入。而且,在建议之前,我知道我可以将 myarray2 设置为像 myarray1 这样的数组浮点数,但我希望它以 float^ myarray2 的形式传入 myarray2。
既然你说你是C++新手,让我指出你不是在那里写经典C++。您正在编写 C++/CLI,这是一组语言扩展,旨在C++与 CLI(.NET Framework(进行互操作。因此,代码中的类型float
是框架类型System::Single
的别名。
问题,错误消息几乎详细说明了允许使用索引器的情况:
系统::Single' 没有默认索引属性(类索引器(
如果类型具有定义的索引属性,则可以使用索引器。
System::Single
,也被称为float
,碰巧没有。表达式必须具有指向对象的指针类型
如果类型是非
void
指针类型,则可以使用索引器。您必须像这样声明它:Example(float* myarray2) {
在这种情况下,
myarray2[i]
等效于表达式*(myarray2 + i)
。或句柄到C++/CLI 阵列类型
如果索引器类型是 C++/CLI
array
类型的句柄 (^
(,则可以使用索引器。如您所知,您必须像这样声明它:Example(array<float> ^ myarray2) {
底线是,尽管您可以将float*
(指向float
的指针(视为 C 样式的float
数组(由于 C 和C++关于数组和指针算术的规则(,但这些东西根本不适用于 float^
(句柄到float
(类型(特定于C++/CLI(。
Example(float^ myarray2)
这并不意味着你认为它的作用。 你习惯了 C 语言的行为,float[] 可以自动衰减到数组的第一个元素的 float*。 有点不幸的是,也延续到了C++。
但不是进入C++/CLI,它从根本上是无法验证的代码。 并负责大量的错误和安全问题。 一个核心问题是构造函数不知道数组中存储了多少元素。 你硬编码了"3",但如果调用方传递一个更小的数组,那么就会发生非常糟糕的事情。
它的实际含义是"引用系统::单身的盒装副本"。 编译器试图理解这一点,不可避免地,它开始变得非常困惑你接下来要做什么。 与使用 [] 运算符一样,这要求类型具有索引器。 浮点数没有浮点数。
您需要以下任一:
Example(array<float>^ myarray2)
这是安全且可验证的,您不能为数组编制越界索引。 而且您不必再硬编码"3",您可以简单地使用 myarray2->Length 代替。 而且您(通常(不再复制数组,只需分配 myarray1。 您将通过传递 gcnew array<float> { 1, 2, 3 }
来调用构造函数。
或:
Example(float* myarray2)
它的工作方式就像它在 C 和 C++ 中的方式一样。 如果要使用该 float[] 调用构造函数,则需要这样做。 无法验证,您需要那个神奇的"3"。 请考虑添加一个额外的参数来传递数组长度。