我们可以绑定对函数返回值的引用吗?

时间:2014-09-25 18:52:58

标签: c++

这是我的问题:

我有两个类VectorMatrix,我定义了两个函数,一个用于计算向量和矩阵的乘法,另一个用于将值赋给新的向量。

以下是代码:

  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;

它可以编译但会遇到问题。

任何人都可以给我一个如何处理这个问题的提示吗?是因为我试图用函数的返回值绑定引用吗?非常感谢!

3 个答案:

答案 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;
    }
  }
}