Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Przeciążanie operatora porównania

Ostatnio zmodyfikowano 2013-04-08 17:20
Autor Wiadomość
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:
C/C++
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:

C/C++
#ifndef prostokat_h
#define prostokat_h
#include "Okrag.h"
class CProstokat
    : public CFigura
{
    ...
};
#endif

Klasa COkrag jest zadeklarowana w pliku Okrag.h
C/C++
#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
C/C++
COkrag kolko;
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.
P-80100
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.
P-80105
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).
C/C++
class KlasaA
{
    KlasaBBB obiektBBB; //error - taki typ nie istnieje
}

class KlasaBBB
{
    KlasaA obiektA; //OK, typ KlasaA zostal juz stworzony
}

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.

C/C++
class KlasaBBB;
class KlasaA; //Warto tworzyc deklaracje nawet jesli teoretycznie nie sa one potrzebne. W razie pozniejszych zmian nie bedzie niepotrzebnych problemow.

class KlasaA
{
    KlasaBBB obiektBBB;
}

class KlasaBBB
{
    KlasaA obiektA;
}

Napraw ten problem i zobaczymy czy przeciążenie będzie działać czy nie.
P-80109
Marval
Temat założony przez niniejszego użytkownika
» 2013-04-06 22:07:41
Zaprzyjaźnienie pomogło, dzięki wielkie.
P-80110
pekfos
» 2013-04-07 11:04:08
Pozwoliłem sobie otworzyć bo:
C/C++
class KlasaBBB;
class KlasaA; //Warto tworzyc deklaracje nawet jesli teoretycznie nie sa one potrzebne. W razie pozniejszych zmian nie bedzie niepotrzebnych problemow.

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ę.
P-80131
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.

C/C++
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;
}
P-80148
pekfos
» 2013-04-07 14:52:12
Możesz wytłumaczyć, co ty właściwie próbujesz zrobić? (Kod dalej nie ma sensu)
P-80152
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.
P-80170
« 1 » 2
  Strona 1 z 2 Następna strona