Коммутативная перегрузка операторов + 2 разных объектов - PullRequest
6 голосов
/ 22 сентября 2010

У меня есть 2 класса, которые представляют матрицу:
1. RegularMatrix - представление O (n ^ 2)
2. SparseMatrix - матрица, представленная в виде связанного списка (без нулей).

Допустим, у меня есть:

RegularMatrix a;
SparseMatrix b;

Я хочу иметь возможность:

a+b;

, а также:

b+a;

, поэтому я перегружаюсьоператор +Мой вопрос таков: поскольку я хочу, чтобы сложение было коммутативным (a + b = b + a), нужно ли мне реализовать 2 перегрузки, по одной для каждого случая?

RegularMatrix operator+(const RegualarMatrix &, const SparseMatrix &);
RegularMatrix operator+(const SparseMatrix & ,const RegualarMatrix &);

или существует общая формакакой компилятор решит сам?

Спасибо

Ответы [ 2 ]

8 голосов
/ 22 сентября 2010

Да, вам нужны обе версии. Но вы можете переслать один другому, если операция действительно коммутативна

RegularMatrix operator+(const SparseMatrix &a, const RegualarMatrix &b) {
    return b + a;
}
1 голос
/ 03 января 2016

Обе версии требуются, просто напишите после первой перегрузки:

RegularMatrix operator+(const SparseMatrix &a, const RegualarMatrix &b)
{
    return operator+(b,a);
}

или более простая версия:

RegularMatrix operator+(const SparseMatrix &a, const RegualarMatrix &b)
{
    return b + a;
}
...