Перегрузка оператора (*, +, -, /, =)? - PullRequest
2 голосов
/ 01 декабря 2011

Я пытаюсь перегрузить (*, +, -, /, =) операторы класса FLOAT. Я написал этот класс:

class FLOAT{
private:
float x;
public:
FLOAT(){    x=0.0;  }
void setFloat(float f)      {   x=f;    }
void operator+(FLOAT obj)   {x=x+obj.x; };
void operator-(FLOAT obj)   {x=x-obj.x; };
void operator*(FLOAT obj)   {x=x*obj.x; };
void operator/(FLOAT obj)   {x=x/obj.x; };
FLOAT& operator=(const FLOAT& obj)  {this->x=obj.x; return *this;   };
};

и я им пользуюсь таким:

int main() {
FLOAT f,f2,f3;
f.setFloat(4);
f2.setFloat(5);

f3=f+f2;// here is the problem!
    system("pause");//to pause console screen
return 0;
}

f3=f+f2 кажется не прав. Что я могу сделать?

Ответы [ 6 ]

8 голосов
/ 01 декабря 2011

Я думаю, что ваши реализации операторов не будут делать то, что вы хотите.Например:

FLOAT f1; f1.setFloat(1.0);
FLOAT f2; f2.setFloat(2.0);
FLOAT f3;
f3 = f1 + f2;

Если вы измените оператор + (), например, чтобы вернуть FLOAT, у вас все равно будет эффект, что после сложения f1 и f3 будут равны 3,0;

Обычно используемая идиома заключается в реализации таких операторов, как + = в классе, и таких операторов, как + вне класса.Например:

class FLOAT {...
    FLOAT& operator+=(const FLOAT& f)
    {
        x += f.x;
        return *this;
    }
};

...

FLOAT operator+(const FLOAT& f1, const FLOAT& f2)
{
    FLOAT result(f1);
    f1 += f2;
    return f1;
}

Дополнительным преимуществом этого является то, что вы также можете легко добавлять другие операторы, такие как

FLOAT operator+(int x, const FLOAT& f);
FLOAT operator+(double x, const FLOAT& f);

Выполнениетщательная работа над таким классом является хорошей практикой, когда вы хотите выполнять эту работу с более интересными типами, такими как комплексные числа или матрицы.Не забудьте добавить операторы сравнения, конструктор копирования, деструктор и операторы присваивания для полноты.Удачи!

6 голосов
/ 01 декабря 2011

Ваши операторы эквивалентны +=, -= и т. Д. Если вы хотите +, вам также нужно вернуть значение!

FLOAT operator+(FLOAT obj)
{
    FLOAT tmp;
    tmp.x = x+obj.x;
    return tmp;
}
5 голосов
/ 01 декабря 2011

Вы не можете присвоить возвращаемое значение функции void ни к чему, потому что она ничего не возвращаетОбъявление перегрузок оператора в качестве дружественных функций зачастую гораздо более гибко.Ваш класс и функции должны быть примерно такими:

class FLOAT { 
    friend FLOAT operator+( const FLOAT & a, const FLOAT & b );

   /* ... rest of class ... */
};


FLOAT operator+( const FLOAT & a, const FLOAT & b ) 
{
    FLOAT temp( a );
    temp.x += b.x; 
    return temp;
}
4 голосов
/ 01 декабря 2011

Вы должны вернуть результат в каждом случае.Также передайте аргумент по ссылке, чтобы он не был скопирован, и добавьте некоторые const квалификаторы.Для + это может выглядеть так:

FLOAT operator+(const FLOAT& obj) const
{
    FLOAT res;
    res.x = x + obj.x;
    return res;
}

Примечание вы можете не захотеть возвращать const, так как вы хотите получить изменяемый объект.

3 голосов
/ 01 декабря 2011
void operator+(FLOAT obj)   {x=x+obj.x; };

Что не так в этом коде?

Возвращает void, и вы хотите назначить это где-нибудь. Не ходи.

FLOAT & FLOAT::operator=(const FLOAT &rhs) {
    ...  // todo assignment here
    return *this;  // Return a reference to myself.
}

FLOAT & FLOAT::operator+=(const FLOAT &rhs) {
   ...  //todo implement compound + operator
   return *this;  // Return a reference to myself.
  }

const FLOAT FLOAT::operator+(const FLOAT &rhs) const {
    return FLOAT(*this) += other; //that's already done :)
  }
1 голос
/ 01 декабря 2011

operator+ имеет тип возврата void. Вероятно, он должен вернуть FLOAT.

Для пояснения на примере, void operator+(FLOAT obj) {x=x+obj.x; }; вместо этого должно выглядеть как FLOAT operator+(FLOAT obj) { return obj.x + x; }. Это связано с тем, что, как отмечали другие, функция с типом возврата void не может возвращать никакого значения. Поскольку обычно ожидается, что operator+ вернет значение, представляющее результат сложения, вы должны вернуть объект FLOAT, содержащий этот результат.

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