Перегрузить операторы для работы с объектами класса? - PullRequest
0 голосов
/ 11 декабря 2011

Как я могу изменить следующий код таким образом, чтобы мне не нужно было повторять f2=11; f3=12; в основной функции.Код предназначен для перегрузки наиболее распространенных операторов.

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

int main() {
    FLOAT f,f2,f3;
    f2=11;
    f3=12;

    f=f3-f2;
    cout<<"f3-f2 ="<<f.getFloat()<<endl;


    f2=11;
    f3=12;
    f=f3+f2;
    cout<<"f3+f2 ="<<f.getFloat()<<endl;

    f2=11;
    f3=12;
    f=f3*f2;
    cout<<"f3*f2 ="<<f.getFloat()<<endl;

    f2=11;
    f3=12;
    f=f3/f2;
    cout<<"f3/f2 ="<<f.getFloat()<<endl;

    system("pause"); // to pause console screen
    return 0;
}

Ответы [ 2 ]

3 голосов
/ 11 декабря 2011

@ Ответ Оли в значительной степени говорит вам, что минимальное , что вам нужно сделать, чтобы ваш код работал. Однако я вижу (и знаю, что даже @Oli видит), что ваша реализация класса имеет много недостатков.

Поскольку вы внедрили FLOAT, я объясняю вам реализацию Double (реализация FLOAT будет аналогичной).

class Double {
  double data;
public:
  Double (double p=0.0) : data(p){}
  double value() { return data; }
  Double & operator+=(Double const & other) 
  {
         data += other.data; 
         return *this;
  }
  Double & operator-=(Double const & other) 
  {
         data -= other.data; 
         return *this;
  }
  //...
};

Обратите внимание, что вам не нужно реализовывать operator=(Double const&) и Double(Double const&). Сгенерированные компилятором будет достаточно. Поскольку конструктор принимает один аргумент типа double, вам также не нужно реализовывать operator=(double const &). Компилятор, сгенерированный копией-семантикой, вместе с конструктором позаботится об этом.

Теперь посмотри на это,

//implement operator+ and operator- as non-member functions
Double operator+(Double a,  Double const & b)
{
    a += b; //a is local copy, so we can change it
    return a;
}
Double operator-(Double a,  Double const & b)
{
    a -= b; //a is local copy, so we can change it
    return a;
}

Обратите внимание, что я реализовал operator+ и operator- в терминах operator+= и operator-= соответственно.

Аналогично, вы можете реализовать operator/= и operator*= в качестве функций-членов, а затем реализовать operator/ и operator* в терминах их!

2 голосов
/ 11 декабря 2011

Ваши операторы должны создать новый экземпляр; они не должны изменять себя (на самом деле, они должны быть объявлены const, чтобы предотвратить это).

например:.

FLOAT operator+(FLOAT obj) const
{
    FLOAT tmp;
    tmp.setFloat(x + obj.x);
    return tmp;
}

Обратите внимание, что существует гораздо больше идиоматических способов определения перегрузок операторов (например, определение operator+ в терминах operator+= и определение конструктора, который принимает float). Но вышесказанного должно быть достаточно.

...