C++数组和系统::单一



我对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)

我得到的错误如下:

  1. 系统::Single' 没有默认索引属性(类索引器(
  2. 表达式必须具有指向对象的指针或句柄到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"。 请考虑添加一个额外的参数来传递数组长度。

最新更新