复制构造函数中的C++数组类型不可赋值

C++ Array Type Not Assignable in Copy Constructor

本文关键字:类型 赋值 数组 C++ 构造函数 复制      更新时间:2023-10-16

我有一个简单的类来表示一个三角形,它包含三个数组。

class Triangle
{
public:
  double         X[3];
  double         Y[3];
  unsigned char color[3];
};

我想在堆上创建此类的对象,然后将它们传递给一个函数,该函数将使用数组中的值。由于我正在传递这些对象,所以我需要一个复制构造函数来进行深度复制。在复制构造函数中分配新数组时会出现问题。

这就是我迄今为止所拥有的:

Triangle (const Triangle &obj)
{
    X = new double[3];
    Y = new double[3];
    color = new unsigned char[3];
    for (int i=0; i<3; ++i)
    {
        X[i] = obj.X[i];
        Y[i] = obj.Y[i];
        color[i] = obj.color[i];
    }
}

我一直收到以下错误:"错误:数组类型'double[3]'不可赋值"。

我采用的方法与本视频中讨论的方法相同,我不明白为什么我无法制作新阵列。这个问题的答案也有同样的方法。

有人有什么见解吗?我觉得我只是错过了一些非常愚蠢的事情。

我正在采取与本视频中讨论的方法相同的方法。

在视频中,您可以看到他使用成员初始化器列表来初始化数组。阅读成员初始值设定项列表,以及它与在构造函数体内部分配数据成员的区别。

您还可以看到,他使用了一个指针,并动态分配了new。如果在编译时不知道数组的大小,则需要这样做(原文如此)。在您的情况下,已知它是3,因此不需要new

一旦您声明了数组,您就拥有了数组。没有必要分配新的内存和复制东西,因为空间已经分配给数组了。正如@WhozCraig所说,你甚至不需要复制构造函数,因为它会隐式生成,可以满足你的需求。

这个问题的答案也有同样的方法。

很简单,C++不是Java。

这是因为'X'、'Y'和'color'不是指针类型。即使没有深度复制,这些数组也会被分配,并且具有相同的值。

无法在Triangle构造函数中分配新数组的原因是X和Y字段不是指向double的指针,而是类型为double的数组。

在C和C++中,数组和指针之间的区别有很多混淆。在这种情况下,当创建一个新的三角形时,分配的内存将足够大,可以容纳6个双字符和3个无符号字符,编译器将XYcolor的地址基于为整个类分配的内存的起始地址。