Problem z deklaracja operatora.

0

Witam, mam 3 klasy o nastepujacej strukturze:

class Czworokat
{
  public:
    float Bok1,Wysokosc;
};
class Prostokat : public Czworokat
{
  public:
    float Pole,Objetosc;
    Prostokat();
    Prostokat(float Bok, float Wysokosc);
    Prostokat operator+ (Prostokat Bok);
    //tu chcialbym dodac taki operator: Prostokat operator+ (Kwadrat Bok);
};

class Kwadrat : public Czworokat
{
  public:
    float Pole,Objetosc;
    Kwadrat();
    Kwadrat(float Bok, float Wysokosc);
    Kwadrat operator+ (Kwadrat InnyKwadrat);
    Kwadrat operator+ (Prostokat Bok);
};

Chodzi mi o to ze nie moge przeciazyc operatora+ klasy Prostokat
piszac:

Prostokat operator+ (Kwadrat Bok);

gdyz klasa kwadrat nie zostala jeszcze zadeklarowana.
Czy mozna jakos to objesc?
Z gory dziekuje za pomoc,

Pozdrawiam,

Wodzu.

0
...
class Kwadrat;

class Prostokat : public Czworokat
{
...
0

Dzieki za pomoc.

Chociaz nie rozumiem dlaczego to dziala.

Czy klasy mozna powtornie deklarowac?

Pozdrawiam,

Wodzu

0

A jak teraz zdefiniowac drugi operator+ dla klasy Kwadrat ale tak zeby zwracal mi wartosc Prostokat?

takie cos niestety nie dziala, nie iwem jak to ugryźć :/

Prostokat Kwadrat::operator+ (Prostokat InnyProstokat)
{
  Prostokat Prst;
  return Prst;
}
0

Nie dziala, bo masz juz jeden operator + przyjmujacy Prostokat za argument. Jak gdzies w kodzie kompilator natrafi na "+ (Prostokat)" to nie wiedzialby, ktora funckje wywolac.

0

Nie dziala, bo masz juz jeden operator + przyjmujacy Prostokat za argument. Jak gdzies w kodzie kompilator natrafi na "+ (Prostokat)" to nie wiedzialby, ktora funckje wywolac.

Niestety nie masz racji, poczytaj troche o przeciążaniu operatorów i o wlasciwosciach klas.

Pozdrawiam,

Wodzu

0

Nie dziala, bo masz juz jeden operator + przyjmujacy Prostokat za argument. Jak gdzies w kodzie kompilator natrafi na "+ (Prostokat)" to nie wiedzialby, ktora funckje wywolac.

Niestety nie masz racji, poczytaj troche o przeciążaniu operatorów i o wlasciwosciach klas.

To Ty poczytaj, bo to Tobie nie dziala, nie mi. :[

Napisanie:

Kwadrat Kwadrat::operator + (Prostokat) { /*....*/ }
Prostokat Kwadrat::operator + (Prostokat) { /*....*/ }

jest niejednoznaczne i nie moze dzialac, bo typ argumentu obu operatorow jest taki sam. A o to chyba pytales? Przeciazanie funkcji i operatorow dziala tak samo. Przy wyborze egzemplarza przeciazonej funkcji typ wyniku NIE JEST BRANY POD UWAGE. Brane sa argumenty i obecnosc kwalifikatora const. Jesli jakis kompilator robi inaczej, to jest niezgodny ze standardem i nie polegalbym na tym zachowaniu.

0

...jest niejednoznaczne i nie moze dzialac, bo typ argumentu obu operatorow jest taki sam.

Gdyby typ argumentu obu operatorow bylby taki sam to oczywiscie zeby to nie dzialalo, ale typy sa RÓŻNE. No chyba, ze Ty porownujesz operatory z innych klas co jest na moj chlopski rozum pozbawione sensu;)

Problem juz rozwiazalem a kompilator jest brolandowski w wersji 3.1.
pozdrawiam,

Wodzu

0

Napisales cos takiego:

A jak teraz zdefiniowac drugi operator+ dla klasy Kwadrat ale tak zeby zwracal mi wartosc Prostokat?

takie cos niestety nie dziala, nie iwem jak to ugryźć :/
<cpp>
Prostokat Kwadrat::operator+ (Prostokat InnyProstokat)

We wczesniejszym kodzie miales juz
"Kwadrat Kwadrat::operator + (Prostokat) { }"

0

Okej chyba tu nastapilo jakies nieporozumienie, byc moze wyrazilem sie nie jasno.
Majac na mysli "drugi operator" mialem na mysli ten ktory juz istnieje w klasie kwadrat.

Kwadrat operator+ (Prostokat Bok);

Powinien on oczywiscie wygladac tak(wkradl sie tutaj blad literkowy):

Prostokat operator+ (Prostokat Bok);

Ale mimo ze go zdefiniowalem w nastepujacy sposob:

Prostokat Kwadrat::operator+ (Prostokat InnyProstokat)
{
  Prostokat Prst;
  return Prst;
} 

To kompilator zwracal blad.
A zwracal go dlatego, ze nie zdefiniowalem konstruktora dla klasy Prostokat ;)
Myslalem, ze skoro kompilator nie zwraca bledu przy samych deklaracjach metod, operatorow i konstruktorow to wszystko jest wporzadku. Jak widac nie.

Pozdrawiam,

Wodzu

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