【问题标题】:Operator overloading: No match for 'operator[]'运算符重载:'operator[]' 不匹配
【发布时间】:2014-02-18 05:20:21
【问题描述】:

该类由存储动态二维数组的对象“mPoint”组成。我正在尝试这样做,以便可以比较其中两个矩阵以查看它们是否等效。因此我重载了运算符'=='。

我收到错误消息“'operator[]' 不匹配(操作数类型是 'Square_Matrix 和 'int'),它指向行“if (mPoint[ i ][ j ] != Par[ i ][ j ])" 在 .cpp 文件中。我该如何解决这个问题?我对重载很陌生

//header file
#include <iostream>
using namespace std;

class Square_Matrix
{
public:
   int **mPoint;
   int size;
   void Set_Size (int new_size);
   bool operator==(Square_Matrix Par);

.

//.cpp file
#include <iostream>
using namespace std;
#include "Square_Matrix.h"

void Square_Matrix::Set_Size (int new_size)
{
    for (int i = 0; i < size; i++){
        delete [] mPoint[i];
    }
    delete [] mPoint;

    size = new_size;
    mPoint = new int*[new_size];
    for (int i = 0; i < new_size; i++){
        mPoint[i] = new int[new_size];
    }
}

bool Square_Matrix::operator==(Square_Matrix Par){
    if (size != Par.size){
        return false;
    }
    for (int i = 0; i < size; i++){
        for (int j = 0; j < size; j++){
            if (mPoint[ i ][ j ] != Par[ i ][ j ]){
                return false;
            }
        }
    }
    return true;
}

【问题讨论】:

  • 请显示你的重载定义operator[]
  • 如果您还没有定义一个,那么这就是您收到错误的原因。

标签: c++ operator-overloading


【解决方案1】:

您在此行有您的问题if (mPoint[ i ][ j ] != Par[ i ][ j ]){ 您直接尝试在Square_Matrix 的实例上应用运算符[][]。这就是为什么编译器说“'operator[]'不匹配”

您应该使用if (mPoint[ i ][ j ] != Par.mPoint[ i ][ j ]){ 之类的东西来解决这个问题。我认为这是一个错字。

最好将const Square_Matrix&amp; 作为参数传递。 在您的头文件中,将您的 operator== 签名更改为, bool operator==(const Square_Matrix&amp; Par);

在cpp文件中

bool Square_Matrix::operator==(const Square_Matrix& Par)
{
    // your logic.
}

【讨论】:

  • 请注意,您的操作员的编写方式是您每次拨打电话时都在复制课程 - 这会减慢您的应用程序。最好将签名更改为 const ref。
  • @Foxic - 不要在 operator== 函数中传递值。这将给出@Peter R 提到的问题,最好将参数更改为const Square_Matrxi&amp; Par
【解决方案2】:

最简单的解决方案是将您的operator==() 更改如下:

bool Square_Matrix::operator==(const Square_Matrix& Par){
    if (size != Par.size){
        return false;
    }
    for (int i = 0; i < size; i++){
        for (int j = 0; j < size; j++){
            if (mPoint[ i ][ j ] != Par.mPoint[ i ][ j ]){
                return false;
            }
        }
    }
    return true;
}

您的 Square_Matrix 类没有 operator[]()。此外,由于这是一个类成员函数,您可以访问 Square_Matrix 输入参数的私有成员 - 所以直接使用它们。最后,您应该将其设为引用以避免复制,但这也意味着您希望阻止更改,因此将其设为 const 引用。

【讨论】:

  • 错误:'bool Square_Matrix::operator==(const Square_Matrix&)' 的原型与类 'Square_Matrix' 中的任何内容都不匹配 //// 错误:候选者是:bool square_Matrix::operator== (Square_Matrix)
  • 您需要更改头文件以匹配新签名。
猜你喜欢
  • 1970-01-01
  • 2012-11-06
  • 2018-07-19
  • 2012-07-23
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多