2012-04-06 62 views
0

我正在努力让我的头绕着运算符重载。在这种情况下,我有+运营商和我试过的例子,任何帮助将不胜感激。运算符重载C++的建议

我得到它说“invaild使用‘类矩阵’我不确定如何解决这个问题我怎么能添加这两个矩阵的对象一起错误?

Matrix Matrix::operator+(const Matrix& rhs){ 
return Matrix(Matrix + rhs.Matrix()); 
} 


    Matrix::Matrix(int MM, int NN){ 
        M = MM; 
        N = NN; 
        data = new double[M * N]; 
        for (int i =0; i < M; i++) 
        { 
         for (int j = 0; j < N; j++) 
         { 
          data[i* N+j] = (double) 1000 + i*N+j; 
        //  cout << data[i*N+j] <<"\t"; 
         } 
         //cout <<"\n"; 
        } 

     cout << "Matrix Constructor... (code to be implemented here!!!)\n";} 

感谢

+1

你的问题是什么? – Christian 2012-04-06 10:52:05

+0

关于运算符重载的一个很好的阅读http://courses.cms.caltech.edu/cs11/material/cpp/donnie/cpp-ops.html – Marius 2012-04-06 12:31:23

回答

1

jpm的回答非常重要。一旦你解决了这些问题,你可以看看我的。

实质上,运算符重载与其他函数没有区别。

因此,在案件:

Matrix Matrix::operator+(const Matrix& rhs) 

你真的做什么有一句话:添加到RHS当前矩阵,并返回一个新的矩阵。你的超载不应该改变当前的矩阵。帮助自己,并用一个常数:

Matrix Matrix::operator+(const Matrix& rhs) const 

矩阵加法一样,应该先检查是否矩阵具有相同的尺寸,这样就可以通过所有的“细胞”,一起加入他们,然后循环和添加它们,并创建一个矩阵。对于这一点,我猜你需要一个第二个构造函数,是这样的:

Matrix::Matrix(int MM, int NN, double values[]) 
{ 
    M = MM;//TODO: change to width 
    N = NN;//TODO: change to height 
    data = new double[M*N]; 
    for(int i < 0; i < M; i++) 
     for(int j < 0; j < N; j++) 
      data[i * N+j] = values[i * N+j]; 
} 
+1

只是为了澄清一点。当他说“将rhs添加到我的当前矩阵中”时,他并没有改变当前矩阵的值。该运算符不应该影响当前矩阵的状态。相反,我们希望从这个矩阵中取值,将它们添加到rhs的值中,并将所有结果填入一个全新的矩阵。只是要清楚。 – jpm 2012-04-06 11:12:10

+0

@jpm相当好,先生。 – MPelletier 2012-04-06 11:14:46

4
  1. RHS 一个Matrix
  2. 调用构造函数的方法等是
  3. 在十分非法,Matrix不是标识符
  4. 一旦您将标识符清理出来,*this + rhs就相当于this->operator+(rhs)。从这里可以明显看出,你在这里完成的所有工作都是创建一个无限递归。
+1

我甚至没有看你的构造函数代码,所以请不要理解它从这份名单中缺席我认可它的有效性。 – jpm 2012-04-06 10:59:02

+1

此外,由于您在构造函数中使用'new'通过堆内存管理'data'成员(并且可能在您的析构函数中使用了相应的'delete'),因此您应该定义一个复制构造函数和赋值运算符,数据的副本,因为C++提供的默认数据可能会导致像多个'Matrix'实例引用相同'data'指针(如果被复制)和副本上悬挂指针问题的问题。 – 2012-04-06 11:17:39

+0

'Matrix'是一个标识符,它只是一个类型而不是一个变量。 – 2012-04-06 12:49:43

0
return Matrix(Matrix + rhs.Matrix()); 
       ^^^^^^  ^^^^^^ 

您使用那里应该是一个表达式类型名称(Matrix) - 这是编译器是什么抱怨。你也试图在一个现有的对象上调用构造函数,这是无效的(和无意义的)。您似乎也试图以自称的方式实施operator+;如果你以某种方式进行编译,那么由于无限递归会导致堆栈溢出。

也许是为了实现除了最简单的方法是实施operator+=一个矩阵添加到现有的一个,然后在这方面实现operator+

Matrix & Matrix::operator+=(Matrix const & rhs) { 
    // Perform addition here 
    for (int i = 0; i < N*M; ++i) { 
     data[i] += rhs.data[i]; 
    } 
    return *this; 
} 

// This can be a non-member function 
// Pass "lhs" by value to get a copy, then modify and return that. 
Matrix operator+(Matrix lhs, Matrix const & lhs) { 
    return lhs += rhs; 
} 

// Or if you really want a member function for some reason 
Matrix Matrix::operator+(Matix const & rhs) const { 
    return Matrix(*this) += rhs; 
} 

但这需要你有一个正确的拷贝构造函数 - 由于您在构造函数中自己分配内存,并且可能将其释放到析构函数中,所以您必须执行实施复制构造函数以正确分配新内存(根据Rule of Three),否则您将在执行后双重删除复制一个矩阵。