Virtuální friend funkce – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Virtuální friend funkce – C / C++ – Fórum – Programujte.comVirtuální friend funkce – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Blujacker
~ Moderátor
0
Grafoman
10. 4. 2011   #1
-
0
-

Ahoj,

snažím se přetížit operátor << u mých objektů. Mám tedy například třídu Bedna:



#include<iostream>
using namespace std;

class Bedna{
public:
Bedna();
friend ostream & operator << (ostream &os, Bedna x);
private:
int typ;
};

Bedna::Bedna(){
typ = 1;
}

ostream & operator << (ostream & os, Bedna x){
os << x.typ << endl;
}

int main(){
Bedna x;
cout << x;
return 0;
}

Tady to přetížení funguje správně. Ale rozhodnu-li se vytvořit ještě třídu Krabice, která bude skoro totožná s třídou Bedna (budou se lišit akorát v hodnotě int typ), tak bych mohl využít dědičnosti a vytvořit si rodičovskou třídu Container, která by implementovala všechny společné vlastnosti obou podtříd.


#include<iostream>
using namespace std;

class Container{
public:
int GetType();
friend ostream & operator << (ostream &os, Container x);
protected:
int typ;
};

ostream & operator << (ostream &os, Container x){
os << "Tady ta funkce by mela byt virtualni a mela by byt prepsana dcerinymi tridami" << endl;
return os;
}

int Container::GetType(){
return typ;
}

/*-----------------------------------------*/
/* Bedna */
/*-----------------------------------------*/

class Bedna: public Container{
public:
Bedna();
friend ostream & operator << (ostream &os, Bedna x);
};

Bedna::Bedna(){
typ = 1;
}

ostream & operator << (ostream & os, Bedna x){
os << x.typ << endl;
}

/*-----------------------------------------*/
/* Krabice */
/*-----------------------------------------*/
class Krabice: public Container{
public:
Krabice();
friend ostream & operator << (ostream &os, Krabice x);
};

Krabice::Krabice(){
typ = 2;
}

ostream & operator << (ostream & os, Krabice x){
os << x.typ << endl;
}

/*-----------------------------------------*/
/* Main */
/*-----------------------------------------*/

int main(){
Bedna bedna;
cout << bedna;
Krabice krabice;
cout << krabice;
Container * seznam = new Container[2];
seznam[0] =bedna;
seznam[1] = krabice;
cout << seznam[0];
cout << seznam[1];
return 0;
}

Potřeboval bych, aby výpis cout << seznam[0] fungoval, ale to nyní nejde - nejdřív by se myslím musel operátor << deklarovat jako virtuální a to friend funkce nemohou být. Jak by se tento problém dal vyřešit?

Dík, Jakub

Nahlásit jako SPAM
IP: 88.100.163.–
Navštivte server Matematika pro každého
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
Reklama
Reklama
ondra.holub+1
Stálý člen
10. 4. 2011   #2
-
0
-

Do předka si strč metodu

virtual void dump(std::ostream& os) const = 0;
V každém potomkovi ji přepiš tak, aby se vypsal ten příslušný potomek. Operátor<< pak definuj jenom pro základního předka tak, že jenom volá metodu dump. friend je pak zcela zbytečný.

Nahlásit jako SPAM
IP: 212.96.189.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 129 hostů

Podobná vlákna

Virtuální Funkce — založil Cruppy

C++ - friend operator — založil jupiik

3D virtuální aplikace — založil Marek Kotala

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý