» »

pomoc pri skladu

pomoc pri skladu

zavger ::

Pozdravljeni!!

Narjprej bi se rad upravicil zaradi moje teme, ampak ta stvar mi ze resnicno greni zivljenje, zato prosim za pomoc.

Zadeva:

Napisal sem sklad vse lepo deluje (vsaj mislim tako), napaka se pojavi ko klicem kopirni konstruktor,
sicer mi objekt skopira, ampak ob zakljucko programa mi javi napako. (da lahk neka poslem microsoftu)

Upam da si bo gdo vzel cas in pogledal kaj je narobe.

Za morebitno resitev bom vecno hvalezen!

Prilagajam se kodo:
// razred vozlisce
class vozlisce
{
public:
       // konstruktorji
       vozlisce(int pod)
       {
          podatek=pod;
          k_naslednji=NULL;
       }
       vozlisce(int pod,vozlisce* next)
       {
         podatek=pod;
         k_naslednji=next;
       }
       // kopirni konstruktor
       vozlisce(const vozlisce& voz)
       {
         podatek=voz.podatek;
         k_naslednji=voz.k_naslednji;
       }
       // destruktor
       ~vozlisce(){};
       
       // vrni podatek
       int VrniPodatek() {return podatek;}
       // spremeni podatek
       void SpremeniPodatek(int p) {podatek=p;}
       // vrni naslednjega
       vozlisce* VrniNaslednjega() {return k_naslednji;}
       // spremeni naslednjega
       void SpremeniNaslednjega(vozlisce* next) {k_naslednji=next;} 
                          
protected:
          int podatek; // podatek
          vozlisce* k_naslednji; // kazalec na naslednje vozlisce
                 
      
};


// razred sklad
class sklad
{
public:
       sklad();
       sklad(const sklad& skl);
       ~sklad();
       
       void Vstavi(int v);
       void Brisi();
       int Vrh() const {return k_vrh->VrniPodatek();}
       bool Prazno() const {if(k_vrh==NULL)return true;
       else return false;}
       int Velikost() const {return stevec;}
       
      
protected:
          vozlisce* k_vrh;  // kazalec na vrh sklada
          int stevec; // stevilo elementov sklada
          
          
          
};

sklad::sklad()
:k_vrh(NULL),stevec(0)
{                  
}

sklad::sklad(const sklad& skl)
{
    vozlisce* k=skl.k_vrh;
    
    stevec=skl.stevec;
    
    while(k!=NULL)
    {
       this->Vstavi(k->VrniPodatek());
       k=k->VrniNaslednjega();
    }
}

sklad::~sklad()
{
    while(k_vrh!=NULL)
    {
       Brisi();
    }
}

// vstavljanje na sklad
void sklad::Vstavi(int v)
{
     // povecamo stevec
     stevec++;
     // vstavljanje prvega elementa
     if(Prazno()==true)
      {
         vozlisce* novi=new vozlisce(v);
         k_vrh=novi;
         return;
         
     }
     // vstavljanje vseh ostalih elementov
     vozlisce* novi=new vozlisce(v,k_vrh);
     k_vrh=novi;
}

// brisanje elementov
void sklad::Brisi()
{
     if(Prazno()!=true)
     {
       vozlisce* pomozni=k_vrh;
       k_vrh=k_vrh->VrniNaslednjega();
       delete pomozni;
       stevec--;
       return;
        
     }
     else
       ..............
        
}


int main()
{
    sklad a;
    
    a.Vstavi(14);
    
    
// napaka
    sklad b(a);
   
    
    cin.get();
    return 0;
}

[edit: oblikoval sem kodo - Gundolf]
zavger
  • spremenil: Gundolf ()

NoUse4AName ::

V kopirnem konstruktorju vidim dve napaki
- ti nikjer ne postavis k_vrh.
- podatke prekopiras v obratnem vrstnem redu. To kar je na vrhu sklada od katerega kopiras, bo na dnu sklada v tistega katerega kopiras.

zavger ::

A bi mi lahk bolj konkretno pomagal.

Kar sem probal zmeraj mi javi napako al pa okno zamrzne - kaj to pomeni;
zavger

Gundolf ::

To da ti tako sporočilo o napaki pokaže pomeni da si nekaj 'zasral' s pointerji. Mislim da ti je tu NoUse4AName kar konkretno namignil kje je problem.

Če sam nahitro pogledam je problem verjetno sledeč: Sklada pri kopirnem konstruktorju ne kopiraš, le kopijo nastaviš da 'kaže' na isti sklad kot original. Ko pobrišeš original (to se zgodi ob izhodu iz programa) si s tem uničiš kopijo. In ko poskuša program uničiti še kopijo pride zato do napake (ker sklada enostavno ni več).

Poskusi se naučiti uporabljati debugger.

zavger ::

Torej pristop

sklad(const sklad& s)
{
k_vrh=s.k_vrh;
.......
}

ni pravilen
zavger

NoUse4AName ::

Poženi debug, ta ti po povedal na katerem mestu pride do napake.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C++] Linker error

Oddelek: Programiranje
51209 (1209) Quikee
»

[C++ naloga] seznam

Oddelek: Programiranje
81326 (1326) BigWhale
»

[C++] NULL: Undeclared identifier - HELP!

Oddelek: Programiranje
101151 (1089) CCfly
»

C++ kopirni konstruktor

Oddelek: Programiranje
103317 (3048) noraguta
»

Ali mi lahko kdo prosim razlozi delovanje tega konstruktorja

Oddelek: Programiranje
61040 (825) noraguta

Več podobnih tem