C ++ друг оператор + перегрузка - PullRequest
1 голос
/ 09 февраля 2011

Я запутался из-за перегрузки друзей-операторов.Это не проблема, если я напишу функцию перегрузки оператора друга в заголовочном файле, но это выдает мне следующие ошибки, когда я переместил функцию в файл класса.Я гуглил некоторые образцы, и все они написали функцию в заголовочном файле.Что я сделал не так?Спасибо.

...: error: expected ‘,’ or ‘...’ before ‘&’ token
...: error: ISO C++ forbids declaration of ‘statisticain’ with no type
...: error: ‘main_savitch_2C::statistician operator+(int)’ must have an argument of class or enumerated type


// a.h
class A
{
    public:
        friend A operator + (const A &a1, const A &a2);
};

// a.cpp
#include "a.h"
A operator + (const A &a1, const A &a2)
{
    //
}

Ответы [ 3 ]

3 голосов
/ 09 февраля 2011

Из сообщения об ошибке, которое вы получаете:

ISO C++ forbids declaration of ‘statisticain’ with no type

Я думаю, что вы допустили ошибку в "статистике", поменяв местами последние две буквы (обратите внимание, что вместо "статистика" у вас есть "статистика").

Это не должно иметь никакого отношения к тому, реализован ли operator+ в заголовке или в файле .cpp.

1 голос
/ 09 февраля 2011

Я согласен с предыдущим ответом.Кроме того, если я могу спросить, зачем делать функцию friend, если оба аргумента и тип возвращаемого значения принадлежат одному и тому же классу?почему бы не сделать его членом, чтобы первый аргумент неявно передавался оператором this?

0 голосов
/ 09 февраля 2011

Переместить версию с двумя параметрами из объявления класса.Или просто используйте один параметр и указатель this.

Вот сокращенный пример из реального мира.

//complexnumber.h 
    class ComplexNumber
    {
        float _r;
        float _i;

        friend ComplexNumber operator+(const ComplexNumber&, const ComplexNumber&);

        public:
            ComplexNumber(float real, float img):_r(real),_i(img) {}
            ComplexNumber& operator + (const ComplexNumber &other);
    };

    ComplexNumber operator+(const ComplexNumber &c1, const ComplexNumber& c2);


//complexnumber.h 
    ComplexNumber operator+(const ComplexNumber &c1, const ComplexNumber& c2)
    {
        return ComplexNumber(c1._r+c2._r, c1._i+c2._i);
    }


    // static
    ComplexNumber& ComplexNumber::operator + (const ComplexNumber &other)
    {
        this->_r = this->_r + other._r;
        this->_i = this->_i + other._i;

        return *this;

    }
...