Перегрузка оператора сложения ("+"). Сложение экземпляров

Мне нужно сложить два объекта класса. Написал оператор, который должен выполнять это действие. Но код не компилируется. Ругается на то, что он не находит подходящий копиконструктор. Т.е. суть такая:

Pyramid p3 = p1 + p2;

В 3-ем объекте сложить поля первых двух.

Как я попробовал решить эту задачу (безуспешно):

Pyramid operator+(const Pyramid& b) {
        Pyramid temp;
        temp.x = this->x + b.x;
        temp.h = this->h + b.h;
        temp.a = this->a + b.a;
        return temp;
    }

Что можно сделать для того, чтобы исправить проблему?

Полный код:

#include <iostream>
#include <fstream>
using namespace std;
int counter = 1; // счетчик. Для форматированного вывода экземпляров
class Pyramid {
    friend double Perimetr(const Pyramid& pyramid);
public:
    double x, h, a; // x - сторона основания, h - высота, a - апофема
    Pyramid() {
        cout << endl << "--------------------------------------------------" << endl;
        cout << "Этот обьект был создан в конструкторе по умолчанию. Область: " << this << endl;
        x = h = a = 3;
    }
    Pyramid(double p, double k, double q) {
        cout << endl << "--------------------------------------------------" << endl;
        cout << "Этот обьект был создан в конструкторе с параметрами. Область: " << this << endl;
        x = p;
        h = k;
        a = q;
    }
    Pyramid(Pyramid& obj) {
        cout << endl << "--------------------------------------------------" << endl;
        cout << "Этот обьект был создан в конструкторе копирования. Область: " << this << endl;
        this->x = obj.x;
        this->h = obj.h;
        this->a = obj.a;
    }
    Pyramid& operator=(Pyramid& obj) {
        if (this != &obj) {
            Pyramid temp;
            obj.x = this->x;
            obj.h = this->h;
            obj.a = this->a;
        }
        return *this;
    }
    Pyramid operator+(const Pyramid& b) {
        Pyramid temp;
        temp.x = this->x + b.x;
        temp.h = this->h + b.h;
        temp.a = this->a + b.a;
        return temp;
    }
    void SHOW() {
        cout << endl << "--------------------------------------------------" << endl;
        cout << "  p" << counter << "\tx --> " << x << ";\th --> " << h << ";\ta --> " << a << endl;
    }
    ~Pyramid() {
        cout << endl << "--------------------------------------------------" << endl;
        cout << "Удаление объекта в области " << this << " деструктором.\n";
    }
private:
    double Sb = 10;
};

double Perimetr(const Pyramid& pyramid);

int main() {
    setlocale(0, "");
    Pyramid p1, p2(2, 4, 6);
    p1.SHOW(); counter++;
    p2.SHOW();
    counter = 1;

    p1 = p2;
    cout << "\nПриравнял p1 к p2 -->>\n";
    p1.SHOW(); counter++;
    p2.SHOW();

    Pyramid p3 = p1 + p2;
    cout << "\nСложил p1 и p2 -->>\n";
    counter = 1;
    p1.SHOW(); counter++;
    p2.SHOW();

    return 0;
}

double Perimetr(const Pyramid& pyramid)
{
    return (2 * pyramid.Sb) / pyramid.a; // формула из файла "ФІГУРИ"
}

Ответы (1 шт):

Автор решения: Harry

Исправьте свои конструктор копирования и оператор присваивания (пока он ни при чем, но потом может сыграть), чтобы они получали константные ссылки:

Pyramid(const Pyramid& obj) {

Pyramid& operator=(const Pyramid& obj) {

Вы же их (аргументы) не меняете? так почему они у вас не константные?

И еще - что за странное присваивание -

obj.x = this->x;
obj.h = this->h;
obj.a = this->a;

Обычно присваивают то, что справа, тому, что слева, а не наоборот!

См. https://ideone.com/3mYNEl

→ Ссылка