我有一个表示三角形的简单类,它包含三个数组。
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]'都不可分配。
我采用与this video中讨论的方法相同的方法,我无法弄清楚为什么我无法创建新数组。 this question的答案也采用相同的方法。
有没有人有任何见解?我觉得我只是错过了一些非常愚蠢的东西。
答案 0 :(得分:1)
我采用的方法与本视频中讨论的相同。
在视频中,您可以看到他使用member-initializer list初始化数组。阅读成员初始化列表以及它与在构造函数体内分配数据成员的不同之处。
您还可以看到他使用指针并使用new
动态分配。如果在编译时不知道数组的大小,则需要(sic)。在您的情况下,它被称为3
,因此不需要new
。
一旦声明了数组,就有了数组。由于已经为阵列分配了空间,因此无需分配新内存和复制内容。正如@WhozCraig所说,你甚至不需要复制构造函数,因为无论如何都会隐式生成一个复制构造函数。
这个问题的答案也有同样的方法。
简单,C ++不是Java。
答案 1 :(得分:0)
因为'X','Y'和'color'不是指针类型。 即使没有深层复制,这些数组也将被分配并具有相同的值。
答案 2 :(得分:0)
无法在Triangle构造函数中分配新数组的原因是X和Y字段不是指针要加倍,它们是double类型的数组。
difference between arrays and pointers in C and C++存在很多混淆。在这种情况下,当创建一个新的三角形时,分配的内存足够大,可以容纳6个双精度和3个无符号字符,编译器将基于 X , Y的地址和 color 在为整个类分配的内存的起始地址上。