Почему перегрузка оператора терпит неудачу, когда я пытаюсь суммировать число плюс матрицу? (но работает наоборот) - PullRequest
4 голосов
/ 27 марта 2020

Вот код моего класса матрицы:

class Matrix3{
public:
    double matrix [3][3];

Необходимые конструкторы и оператор +:

Matrix3::Matrix3(double num){
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            matrix[i][j] = num;
}

Matrix3::Matrix3(const Matrix3 &other){
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            this->matrix[i][j] = other.matrix[i][j];
}

Matrix3 Matrix3::operator+(const Matrix3& other) const{
    Matrix3 temp(*this);
    for(int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            temp.matrix[i][j] += other.matrix[i][j];

    return temp;
}

main:

    Matrix3 a1;     // All Elements are 0 (default)
    Matrix3 a2(a1); // a2 initialize with a1
    Matrix3 a4(4);  // All Elements are 4

    a1 = a1 + 3;   //it works
    a2 = 3 + a2;   //it doesn't, it says: "invalid operands to binary expression"
    a4 = a1 + a2;  //it works too

Итак, я не понимаю, почему первый работает. в обоих случаях следует создать матрицу, в которой все элементы равны 3, потому что для этого есть конструктор, и добавить ее в другую матрицу. Есть идеи?

1 Ответ

7 голосов
/ 27 марта 2020

Это потому, что вы объявили operator + как функцию-член. Это плохая идея именно из-за проблемы, которую вы нашли. Когда operator + является функцией-членом, компилятор C ++ будет автоматически c выполнять преобразования с правой стороны, но не с левой стороны.

Исправьте это, сделав ваш оператор + глобальной функцией с двумя аргументами

Matrix3 operator+(const Matrix3& lhs, const Matrix3& rhs) {
    ...
}

Теперь преобразование из double в Matrix будет выполняться для любого аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...