[C++] Przeciążanie operatora porównania
Ostatnio zmodyfikowano 2013-04-08 17:20
Marval Temat założony przez niniejszego użytkownika |
[C++] Przeciążanie operatora porównania » 2013-04-06 19:57:08 Witam Mam za zadanie zrobić klasę CFigura i dwie klasy pochodne COkrąg i CProstokąt dziedziczące z tej klasy, następnie m.in stworzyć operatory porównania które będą porównywać pola tych dwóch figur zarówno tego samego typu jak i okręgu z prostokątem i jest w treści zadania zaznaczone, że maja to być funkcje składowe klasy ( nie zaprzyjaźnione). Z porównaniem pól dwóch takich samych figur sobie poradziłem, ale problem pojawia się gdy chce porównać dwie różne figury, podczas definicji operatora przykładowo w klasie CProstokat: bool operator <( COkrag A );
kompilator pokazuje błędy: error C2061: syntax error : identifier 'COkrag' error C2805: binary 'operator <' has too few parameters definicja klasy CProstokat zawiera: #ifndef prostokat_h #define prostokat_h #include "Okrag.h" class CProstokat : public CFigura { ... }; #endif Klasa COkrag jest zadeklarowana w pliku Okrag.h #ifndef okrag_h #define okrag_h #include "Prostokat.h" class COkrag : public CFigura { ... }; #endif Dodatkowo zauważyłem ze nie mogę zadeklarować w klasie CProstokat obiektu typu COkrag. po wpisaniu pod protected: zwyklego pokazuje następujące błędy: Error 1 error C2146: syntax error : missing ';' before identifier 'kolko' Error 2 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int Error 3 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int Nie mam pojęcia gdzie tu leży problem, proszę o pomoc. |
|
Hipochondryk |
» 2013-04-06 21:41:16 u mnie kompiluje się bez problemu Twój pseudokod. Być może w ciele odnosisz się do prywatnych składników. Spróbuj zaprzyjaźnić te dwie klasy. |
|
unimator |
» 2013-04-06 21:59:38 Dodatkowo zauważyłem ze nie mogę zadeklarować w klasie CProstokat obiektu typu COkrag. po wpisaniu pod protected: zwyklego pokazuje następujące błędy:
|
Prawdopodobnie dlatego, że typ COkrag nie istnieje (jeszcze). class KlasaA { KlasaBBB obiektBBB; }
class KlasaBBB { KlasaA obiektA; }
Rozwiązaniem tego problemu jest deklaracja typu KlasaBBB przed definicją tegoż typu i jakiegokolwiek użycia tego typu w jakiejkolwiek innej formie niż deklaracja/definicja. class KlasaBBB; class KlasaA;
class KlasaA { KlasaBBB obiektBBB; }
class KlasaBBB { KlasaA obiektA; }
Napraw ten problem i zobaczymy czy przeciążenie będzie działać czy nie. |
|
Marval Temat założony przez niniejszego użytkownika |
» 2013-04-06 22:07:41 Zaprzyjaźnienie pomogło, dzięki wielkie. |
|
pekfos |
» 2013-04-07 11:04:08 Pozwoliłem sobie otworzyć bo: class KlasaBBB; class KlasaA;
class KlasaA { KlasaBBB obiektBBB; }
class KlasaBBB { KlasaA obiektA; } |
..ten kod nie ma prawa się skompilować. Nie można utworzyć obiektu klasy, mając tylko deklarację. |
|
unimator |
» 2013-04-07 14:19:56 @up Ups, mój błąd. Myślałem, że to zadziała tak jak z funkcjami. W takim razie trzeba się bawić we wskaźniki. class KlasaBBB; class KlasaA;
class KlasaA { KlasaBBB * obiektBBB; public: KlasaA(); };
class KlasaBBB { KlasaA * obiektA; public: KlasaBBB(); };
KlasaA::KlasaA() { obiektBBB = new KlasaBBB; }
KlasaBBB::KlasaBBB() { obiektA = new KlasaA; }
|
|
pekfos |
» 2013-04-07 14:52:12 Możesz wytłumaczyć, co ty właściwie próbujesz zrobić? (Kod dalej nie ma sensu) |
|
unimator |
» 2013-04-07 17:55:25 Dodatkowo zauważyłem ze nie mogę zadeklarować w klasie CProstokat obiektu typu COkrag.
|
Coś takiego chciał zrobić autor, obiekty klas równorzędnych zadeklarować jeden w drugim. Zakładam, że to o czym pisałem było problemem. A sens kodu zależy tylko od jego funkcji (funkcjonalności, żeby nie było niedomówień), jaką spełnia. Ten kod miał być przykładem na rozwiązanie jednego z problemów autora. Wiem, że jako realna część programu nie ma sensu bo zapętlił by program. Niby nie mój interes ale 4 post oznacza, że nie ma po co drążyć tematu. |
|
« 1 » 2 |