Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

Pomoc oko preklapanja operatora<< u izvedenoj klasi

  • 3 odgovora
  • 5.432 pregleda

Najnovija ↓

Pomoc oko preklapanja operatora<< u izvedenoj klasi 03.02.2007. u 11:13 · pre 240 meseci #1
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;
}
Re: Pomoc oko preklapanja operatora<< u izvedenoj klasi 03.02.2007. u 11:29 · pre 240 meseci
izmenjeno 1 put, poslednji put 3MAJ86 03.02.2007. u 11:41
  1. 3MAJ8603.02.2007. u 11:41zapis iz teksta poruke
#2
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.
Potpis
when there is a why there is no how
Re: Pomoc oko preklapanja operatora<< u izvedenoj klasi 04.02.2007. u 20:00 · pre 240 meseci #3
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, ...
Potpis
Sendvic uvek pada na namazanu stranu!
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme