Operator konwersji

0

Cześć, napisałem taki kod:

#include<iostream>
using namespace std;

class Dwa;
class Jeden {
    int i;
  public:
    Jeden(int ii):i(ii) {}
    Jeden operator+(Jeden& rv){
      return i+rv.i;
    }
    friend ostream& operator<<(ostream& os,Jeden& rv){
      return os << rv.i;
    }
};

class Dwa {
    int x;
  public:
    Dwa(int xx):x(xx) {}
    Dwa operator+(Dwa& rv){
      return x+rv.x;
    }
    friend ostream& operator<<(ostream& os,Dwa& rv){
      return os << rv.x;
    }
};

int main()
{
  Jeden obiekt(5);
  Dwa obiekt2(10),obiekt3(0);
  cout << obiekt << ' ' << obiekt2 << '\n';
  obiekt3=obiekt+obiekt2;
}

Problemem jest dodawanie dwóch obiektów różnych klas. Próbowałem napisać konwersję z jednej klasy na drugą, ale nic mi z tego nie wyszło. Jak poprawnie zdefiniować operator konwersji?

0
  1. Czego próbowałeś? Może zdefiniuj Jeden operator()(const Jeden&, const Dwa&);
  2. Te klasy są tak do siebie podobne, że mam wrażenie, że coś źle zaprojektowałeś (chyba, że jest to skrót myślowy).
  3. Definiowanie operatorów dla klas jest nie zalecane, bo zwykle zaciemnia kod. Wyjątkiem są oczywiście obiekty, które ze swojej natury powinny być dodawane, odejmowane, mnożone, itd (wektory, macierze, liczby zespolone itp).
0

Sam uczę się C++, a zadanie jest z książki "Thinking in C++" i brzmi:"Utwórz dwie klasy, a następnie zdefiniuj operator+ oraz funkcje odpowiedzialne za konwersję w taki sposób, aby dodawanie było symetryczne w stosunku do obu klas."
Nie wiem, może źle zrozumiałem treść. Nie bardzo wiem natomiast po co mam przeciążać nawiasy, skoro chce dodać wartości obiektów?

0

brakuje ci prawdopodobnie const przy referencjach i kompilator uznaje, że chcesz przekazywać dane z funkcji przez te referencje, więc nie pozwala stosować obiektów automatycznych tworzonych przez konstruktory z odpowiedniego typu.
To zadanie jest brzydkie bo uczy złych sposobów kodowania.
Podpowiedź:

class Jeden {
    int i;
  public:
    Jeden(int ii):i(ii) {}
    Jeden(const Dwa&);
    Jeden operator+(const Jeden& rv) const;
    friend ostream& operator<<(ostream& os,Jeden& rv);
    int wartosc() const;
};
0

MarekR22, jeżeli operator+ byłby globalny i dostał drugi taki sam argument, to by działało...

0
manfredek napisał(a)

MarekR22, jeżeli operator+ byłby globalny i dostał drugi taki sam argument, to by działało...
Doczytaj! Cała sprawa rozchodzi się o to, że argumenty chce podać różnego typu nie definiując nowego operatora, ma zachodzić konwersja.

0

No właśnie, z obu stron operatora. Global na to pozwala, method nie.

0
manfredek napisał(a)

No właśnie, z obu stron operatora. Global na to pozwala, metod nie.

Mylisz się, to może spowodować, że kompilator nie będzie wiedział, którą z dwóch możliwości zastosować, a tak to zajarzy, że Dwa+Jeden ma dać Dwa natomiast Jeden+Dwa ma dać Dwa (chodzi oczywiście o typy nie liczby - to się nazywa głupawe nazewnictwo). Sprawdziłem na kompilatorze MinGW, const rozwiązuje problem, a globalizowanie operatorów tworzy opisany problem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1