[ Mix5 @ 03.02.2007. 10:13 ] @
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;
}
[ 3MAJ86 @ 03.02.2007. 10:29 ] @
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]
[ PeraKojotSuperGenije @ 04.02.2007. 19:00 ] @
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, ...
[ 3MAJ86 @ 08.02.2007. 21:06 ] @
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. :)