Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pomoc oko preklapanja operatora<< u izvedenoj klasi

[es] :: C/C++ programiranje :: Pomoc oko preklapanja operatora<< u izvedenoj klasi

[ Pregleda: 4147 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Mix5
Milos Djuric
STE, Asseco
Jagodina

Član broj: 14282
Poruke: 332
*.yubc.net.



Profil

icon Pomoc oko preklapanja operatora<< u izvedenoj klasi03.02.2007. u 10:13 - pre 209 meseci
Kako mogu da pristupim privatnim clanovim izvedene klase Biciklka, koji su nasledjeni iz osnovne klase, prilikom preklapanja operatora<< ?

Code:
#include <iostream>
#include <cstring>

using namespace std;

class Vozilo {
      int godiste;
      char boja[10];
      float tezina;
      public:
             void napravi (int g, char b[], float t)
             {
                  godiste = g;
                  strcpy(boja,b);
                  tezina = t;
                  }
             friend ostream& operator<< (ostream& dat, const Vozilo& v)
             {
                    dat << '(' << v.godiste << ',' << v.boja << ',' << v.tezina << ')' << endl;
                    }
      };
      
class Automobil: public Vozilo {
      int broj_vrata;
      int broj_tockova;
      float kubikaza;
      int registracioni_broj;
      public:
             void napravi (int bv, int bt, float k, int rb)
             {
                  broj_vrata = bv;
                  broj_tockova = bt;
                  kubikaza = k;
                  registracioni_broj = rb;
                  }
      };
      
class Bicikla: public Vozilo {
      int velicina;
      public:
             void napravi (int v, int g, char b[], float t)
             {
                  velicina = v;
                  Vozilo::napravi (g, b, t);
             }
             friend ostream& operator<< (ostream& dat, const Bicikla& b)
             {
                      //dat << '(' << b.velicina << ',' << b.godiste << ',' << b.boja << ',' b.tezina << ')' << endl;
                      }
      };

main()
{
      Bicikla trek;
      Vozilo v;
      trek.napravi(54,2002,"Crevena",3.5);
      v.napravi(1999,"Plava",4000);
      cout << v;
      cout << trek;
      system("pause");
      return 0;
}
 
Odgovor na temu

3MAJ86
Marko Radić
Business Development Manager, Beauty
Industry
München

Član broj: 46087
Poruke: 253
*.sezampro.yu.

Sajt: marko-radic.blogspot.com


+137 Profil

icon Re: Pomoc oko preklapanja operatora<< u izvedenoj klasi03.02.2007. u 10:29 - pre 209 meseci
U tvom slučaju najbolje bi ti bilo da napraviš apstraktnu klasu 'vozilo' koja će sadržati samo virtualne metode koje ćeš preklopiti u svakom zasebnom vozilu izvedenom iz nje (kao što je slučaj sa tvojim biciklom). Malo je nelogično da postoji objekat 'vozilo' istovremeno kao i 'bicikl', jer tvoje vozilo nije dobro opisano, dok bickl jeste.

Naravno, objekat klase vozilo ne sme postojati. To je samo klasa koja stoji na vrhu hijerarhije i objedinjuje sve klase koje ćeš kasnije (možda) napisati.

Napravi ovako kao što sam napisao i radiće sigurno.

Edit: još jedna stvar. Ne bi trebalo da ti tvoja funkcija operator << prima kao argument objekat te klase. Svaki objekat te klase 'zna' čiji je on objekat, tako da bi trebalo da ti funkcija operatora izgleda ovako:
Code:

ostream& operator << (ostream &dat) {
        cout << this->tezina << this->godiste << .....; //kako već želiš da formatiraš svoj izlaz, i šta već želiš da ispišeš
        return dat;
}


I nakon toga imaš standardni poziv tvog operatora:
Code:

Bicikla trek;
trek.napravi(...);
cout << trek;


'this' je pokazivač na objekat klase 'nad kime' se primenjuje određeni metod. Svakoj funkciji članici klase se osim navedenih argumenata prenosi još jedan argument a to je baš taj 'this'. Čak i metoda koju napišeš da nema ni jedan jedini argument, opet će imati argument this. Za statičke funkcije ovo ne važi.

[Ovu poruku je menjao 3MAJ86 dana 03.02.2007. u 11:41 GMT+1]
when there is a why there is no how
 
Odgovor na temu

PeraKojotSuperGenije
Sasa Popovic
Beograd

Član broj: 44507
Poruke: 126
*.233.eunet.yu.



Profil

icon Re: Pomoc oko preklapanja operatora<< u izvedenoj klasi04.02.2007. u 19:00 - pre 209 meseci
Odgovor na tvoje pitanje je nikako.

Ali to sto hoces da uradis se radi ovako. Ti bi hteo da ti se operator<< ponasa polimorfno. Posto operator<< nije funkcija clanica (ni jedne klase) ona ne moze biti viruelna (pa ni polimorfna), ali naravno mozes da je "nabudzis" da se tako ponasa :)

To ces uraditi tako sto ces u klasi Vozilo napraviti metodu virtual void Pisi(ostream& os); koja ce u os ispisivati sve sto treba i u klasi Vozilo napraviti operator<< koji ce izgledati ovako:

Code:

friend ostream& operator<< (ostream& os, const Vozilo& v){ v.Pisi(os); return os; }


E sad u svim potomcima klase Vozilo napravis novi primerak virtuelne metode Pisi koji ce ispisivati ono sto treba da ispisuje i to je to... U potomcima klase Vozilo NE TREBA da pravis operator<<!!!

Posto jedan jedini operator<< koji si napisao prima referencu na Vozilo moci ce da primi i referencu na Automobil ili Bicikl ili bilo koji potomak Vozila. Onda ce operator<< pozivati virtuelnu metodu Pisi koja ce ako je kao argument Vozilo stampati Vozilo, ako je Bicikl stampati Bicikl, ako je Automobil stampati Automobil, ...
Sendvic uvek pada na namazanu stranu!
 
Odgovor na temu

3MAJ86
Marko Radić
Business Development Manager, Beauty
Industry
München

Član broj: 46087
Poruke: 253
*.sezampro.yu.

Sajt: marko-radic.blogspot.com


+137 Profil

icon Re: Pomoc oko preklapanja operatora<< u izvedenoj klasi08.02.2007. u 21:06 - pre 209 meseci
Da, vidiš... tek sada sam skontao zašto ovo moje 'rešenje' koje sam napisao neće raditi.

U svakom slučaju Pera ti je dobro objasnio. :)
when there is a why there is no how
 
Odgovor na temu

[es] :: C/C++ programiranje :: Pomoc oko preklapanja operatora<< u izvedenoj klasi

[ Pregleda: 4147 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.