这是我的问题:
我有两个类Vector
和Matrix
,我定义了两个函数,一个用于计算向量和矩阵的乘法,另一个用于将值赋给新的向量。
以下是代码:
file: Matrix.cpp
Vector Matrix::operator*(const Vector& v)const {
assert(v.length == numRows);
Vector temp(v.length);
for (int j = 0; j < numCols; j++)
for (int k = 0; k < v.length; k++)
temp.contents[j] += v.contents[k] * contents[k][j];
return temp;
};
file: Vector.cpp
Vector& Vector::operator=(Vector& v){
assert(v.length == length);
if (&v != this) {
for (int i = 0; i < length; i++)
setComponent(i, v.contents[i]);
}
return *this;
};
假设我已经很好地定义了一个4 * 4矩阵m1
和一个1 * 4向量v1
以下是main()
函数
file: main.app
Vector v2(4);
v2 = m1 * v1;
它可以编译但会遇到问题。
任何人都可以给我一个如何处理这个问题的提示吗?是因为我试图用函数的返回值绑定引用吗?非常感谢!
答案 0 :(得分:1)
在您的代码中,您定义了赋值运算符,如Vector& Vector::operator=(Vector &v)
。但它应该像Vector& Vector::operator=(Vector const & v)
。原因是Vector &v
引用lvalue
引用。但m1 * v1
会返回rvalue
。
答案 1 :(得分:0)
写入0x00 .... 04的地址是空ptr的4个字节的偏移量。这意味着您正在尝试通过未初始化的指针进行写入。如果您使用调试器,则可以找到尝试执行此操作的确切代码。
答案 2 :(得分:0)
请注意,您没有与std :: vector发生冲突。 假设您有正确分配的构造函数,复制构造函数(下面给出,也需要赋值运算符)并将所有元素初始化为零
Vector::Vector(int sz) {
contents = new int[length = sz]; // allocation
for (int i = 0; i < sz; i++) {
contents[i] = 0;
}
}
Vector::Vector(const Vector& v) {
contents = new int[length = v.length]; // allocation
for (int i = 0; i < length; i++) {
contents[i] = v.contents[i];
}
}
Matrix::Matrix(int rows, int cols) {
contents = new int *[numRows = rows]; // allocation
for (int i = 0; i < rows; i++) {
contents[i] = new int[numCols = cols]; // allocation
for (int j = 0; j < cols; j++) {
contents[i][j] = 0;
}
}
}
Matrix::Matrix(const Matrix& m) {
contents = new int *[numRows = m.numRows]; // allocation
for (int i = 0; i < numRows; i++) {
contents[i] = new int[numCols = m.numCols]; // allocation
for (int j = 0; j < numCols; j++) {
contents[i][j] = 0;
}
}
}