c++ Propojene pole
Dobry den, zase ja :)
Udelal sem podle knizky propojene pole, jenze v jenom uzlu mam problem, funkce Uzel * UzelHlavy::Vlozit(Data *TaData) vraci this ale vyhodi mi to chybu:
129. D:\MY\Software\Dev-Cpp\Propojenyseznam.cpp cannot convert `UzelHlavy* const' to `Uzel*' in return
Celý kód je zde, Děkuju jestli se na to někdo podívá a pomůže:#include <iostream>
using namespace std;
enum{xJeMensi, xJeVetsi, xSeRovna};
class Data
{
public:
Data(int Hodnota):MojeHodnota(Hodnota) {}
~Data() {}
int Porovnat(const Data &);
void Zobrazit() const { cout << "Hodnota je " << MojeHodnota << endl;}
private:
int MojeHodnota;
};
int Data::Porovnat(const Data & JinaData)
{
if(MojeHodnota < JinaData.MojeHodnota)
return xJeMensi;
if(MojeHodnota > JinaData.MojeHodnota)
return xJeVetsi;
else
return xSeRovna;
}
class Uzel; //Deklarace
class UzelHlavy;
class UzelOcasu;
class VnitrniUzel;
class Uzel
{
public:
Uzel(){}
virtual ~Uzel(){}
virtual Uzel *Vlozit(Data *TaData) = 0;
virtual void Zobrazit();
private:
};
class VnitrniUzel : public Uzel //Uzel, obsahuje vlastni objekt(Data), viz. kapitola Sablony
{
public:
VnitrniUzel(Data *TaData, Uzel *Dalsi);
~VnitrniUzel() {delete MujDalsi; delete MojeData;}
virtual Uzel *Vlozit(Data *TaData);
virtual void Zobrazit() {MojeData -> Zobrazit(); //Delegovat
MujDalsi -> Zobrazit();}
private:
Data *MojeData; //Samotna Data
Uzel *MujDalsi; //Ukazatel na dalsi Uzel v propojenem seznamu
};
VnitrniUzel::VnitrniUzel(Data *TaData, Uzel *Dalsi):MojeData(TaData), //Konstruktor inicalizuje Hodnoty
MujDalsi(Dalsi)
{
}
Uzel *VnitrniUzel::Vlozit(Data *TaData) //Zaklad propojeneho seznamu, posila data dal
{
int Vysledek = MojeData -> Porovnat( *TaData); //Je vetsi nebo mensi nez ja?
switch(Vysledek)
{ //Je-li stejny jako ja, pak patri prede me
case xSeRovna: //Projit Dal
case xJeVetsi: //Nova Data patri prede me
{
VnitrniUzel *DatovyUzel = new VnitrniUzel(TaData, this);
return DatovyUzel;
}
case xJeMensi: //Predame Data dalsimu uzlu, at se stara on
MujDalsi = MujDalsi -> Vlozit(TaData);
return this;
}
return this; //Naplnit MSC
}
class UzelOcasu : public Uzel
{
public:
UzelOcasu() {}
~UzelOcasu() {}
virtual Uzel *Vlozit(Data *TaData);
virtual void Zobrazit() {}
private:
};
Uzel *UzelOcasu::Vlozit(Data *TaData) //Kdyz se ke me neco dostane, jde to prede me
{ //Protoze ja jsem ocas, za mnou uz nic neni!
VnitrniUzel *DatovyUzel = new VnitrniUzel(TaData, this);
return DatovyUzel;
}
class UzelHlavy //UzelHlavy neobsahuje data, jen ukazuje na 1. misto v seznamu
{
public:
UzelHlavy();
~UzelHlavy() {delete MujDalsi;}
virtual Uzel *Vlozit(Data *TaData);
virtual void Zobrazit() {MujDalsi -> Zobrazit();}
private:
Uzel *MujDalsi;
};
UzelHlavy::UzelHlavy() // Kdyz se vytvori Hlava, vytvori se i Ocas
{
MujDalsi = new UzelOcasu;
}
Uzel * UzelHlavy::Vlozit(Data *TaData) //Pred Hlavou nic neni, data se jen poslou dal
{
MujDalsi = MujDalsi -> Vlozit(TaData);
return this;
}
class PropojenySeznam //Nic nedela, ale bez nej by to neslo...
{
public:
PropojenySeznam();
~PropojenySeznam() {delete MojeHlava;}
void Vlozit(Data *TaData);
void ZobrazitVse() {MojeHlava -> Zobrazit();}
private:
UzelHlavy *MojeHlava;
};
PropojenySeznam::PropojenySeznam() //Novy seznam vytvori novou hlavu, ta vytvori ocas
{ //seznam je jinak prazdny
MojeHlava = new UzelHlavy;
}
void PropojenySeznam::Vlozit(Data *pData)
{
MojeHlava -> Vlozit(pData);
}
/* Testovaci Program */
int main()
{
Data *pData;
int Hodnota;
PropojenySeznam ps;
for(true;;) //Pozada uzivatele o zadani dat a prida je do seznamu
{
cout << "Zadejte hodnotu (0 = Konec): ";
cin >> Hodnota;
if(!Hodnota)
break;
pData = new Data(Hodnota);
ps.Vlozit(pData);
}
ps.ZobrazitVse(); //Projit seznamem a zobrazit data
cin.get();
return 0; //ps vypadne z oboru platnosti
}