Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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
}
    
               
             
Předmět Autor Datum
A ktoremu slovu v tej chybovej hlaske nerozumies? Lebo ta hlaska je jasna. Vseobecne ked na to pozer…
MM.. 16.11.2011 19:45
MM..
BTW... pricina preco to hlasi prave u UzelHlavy je to ze tuto triedu nemas odvodenu od Uzel. class…
MM.. 16.11.2011 19:59
MM..
Ok mooooc díky :), moje chyba, ale cílem asi není mít co nejkratší a nejpřehlednější program, ale vy… poslední
Swix 16.11.2011 20:20
Swix

A ktoremu slovu v tej chybovej hlaske nerozumies? Lebo ta hlaska je jasna.
Vseobecne ked na to pozeram (inac riadny chaos) nema zmysel aby ta fcia vobec nieco vracala tak ju mozes zmenit na void a nemas problem, stejne nikde navratovu hodnotu fcie UzelHlavy::Vlozit nepouzivas. Keby si to chcel silou mocou vracat hodnotu tak to this treba pretypovat na Uzel*, alebo zmenit navratovu hodnotu funkcie na typ UzelHlavy*

BTW... pricina preco to hlasi prave u UzelHlavy je to ze tuto triedu nemas odvodenu od Uzel.

class UzelHlavy       - a nic viac.

inac keby som to robil ja tak zadefinujem len jednu triedu uzel (je uplne fuk ci je to hlava alebo konec - v C existuje aj NULL pointer prave na taketo veci ked nieco nema predchodcu alebo naslednika). Je to potom 100x menej chaoticke a 3x kratsi zdrojak.

Zpět do poradny Odpovědět na původní otázku Nahoru