我有一个matrix2d类,它由一个dobule A [2] [2]组成。我试图做一个构造函数,它接受相同类型的obejct并将其所有值复制到A [2] [2]。我有一个问题,这是班级:
class matrix2D {
public:
double A[2][2];
double Z[2][2];
//Default Constructor.
matrix2D() {
A[0][0] = A[1][1] = 1;
A[0][1] = A[1][0] = 0;
}
matrix2D(double x00,double x01, double x10, double x11) {
A[0][0] = x00;
A[0][1] = x01;
A[1][0] = x10;
A[1][1] = x11;
}
现在我要创建一个构造函数,它接受matrix2D对象,然后将其所有值都带到A.
// Copy Constructor.
matrix2D(matrix2D& Z) {
for(int i = 0; i < 2; ++i) {
for(int j = 0; j < 2; ++j) {
A[i][j]=*(Z[i][j]);
}
}
}
它告诉我我尝试为matrix2d对象赋予double。为什么* Z [i] [j]不引用双?
解决: 我做了A [i] [j] = Z.A [i] [j]:)!
答案 0 :(得分:1)
该行中的*
没有意义。
根据数据,您根本不需要复制构造函数。但是,如果你必须实现一个,它需要是:
// Use const&, not just &.
// Use a more suitable variable name for the copy
matrix2D(matrix2D const& copy) {
for(int i = 0; i < 2; ++i) {
for(int j = 0; j < 2; ++j) {
A[i][j]= copy.A[i][j]; // Copy A
Z[i][j]= copy.Z[i][j]; // Copy Z.
}
}
}
答案 1 :(得分:1)
您的复制构造函数中存在问题,您正在隐藏其中一个成员(成员名称Z
和参数名称Z
)。
我建议不要编写自己的复制构造函数,让编译器为你生成一个:
matrix2D(const matrix2D & value) = default;
答案 2 :(得分:1)
添加第二个答案。这就是我喜欢的答案。
只需从类声明和定义中删除复制构造函数。
鉴于您的类只包含一对固定大小的数组,您不需要复制构造函数。编译器会自动为您生成一个。通常只在您的类具有动态分配的成员变量时才需要自定义复制构造函数,并且您需要确保指针值不跨实例别名。
答案 3 :(得分:0)
你当然可以使用for循环技术 - 我认为这有助于你理解数组和指针。但是很难超越memcpy
复制简单类型数组的效率。
// Copy Constructor.
matrix2D(const matrix2D& other) {
memcpy(A, other.A, sizeof(A));
memcpy(Z, other.Z, sizeof(Z));
}