复制构造函数中的C++数组类型不可赋值
C++ Array Type Not Assignable in Copy Constructor
我有一个简单的类来表示一个三角形,它包含三个数组。
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个无符号字符,编译器将X、Y和color的地址基于为整个类分配的内存的起始地址。
- 标准库类型的赋值运算符的引用限定符
- 数组类型 int[n][n] 不可赋值,因为表达式必须具有常量值
- 赋值到类型和空大括号. 语法说明
- 结构化绑定初始值设定项表单 { 赋值表达式 } 对于 clang 上的数组类型失败
- C++:将值赋值给原始数据类型(例如布尔值)是原子操作吗?
- 将"std::string {aka std::basic_string}"赋值中的不兼容类型<char>
- 如何为结构类型变量赋值
- 程序无法编译:将 'int (*)[3][3]' 赋值为 'int [9][3][3]' 中的不兼容类型
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- C++不同类型的默认赋值运算符
- 为什么类的赋值运算符的返回类型通常是非常量(而不是常量)引用?
- 将"float*"赋值为"float* [1000]"中的不兼容类型
- 具有抑制移动构造/赋值的类型如何仍被视为可移动类型?
- 具有临时对象的 Fundamenta 数据类型赋值运算符
- 当我们给char数据类型赋值为负值时,它为什么表现得像int数据类型
- 在 c++11 中,指针的"auto"类型赋值是否需要"*"?
- 使用字面值为模板类型赋值
- 使用一个方法实现不同类型赋值的优雅方式,并且没有警告
- 从"int"到非标量类型赋值运算符的转换 - 对象到 int
- 将较小的整数类型赋值给较大的整数类型是否不安全?