[C++]przekazywanie danych pomiędzy klasami


(Takijeden89) #1

Witam,

pewnie banalne, ale rozwiązania szukam, szukam i nie mogę znaleźć - pewnie nie wiem czego szukać....

Przykład problemu:

class Zespolona{

    public:

        float Re;

        float Im;

}


class KlasaPosredniczaca{

    public:

        Zespolona TabStosu[ROZMIAR];

    public:

        void Zapisz(Zespolona Z);

        Zespolona Daj(int Indeksik);

};


void KlasaPosredniczaca::Zapisz(Zespolona Z){

    TabStosu[Indeks++]=Z;

}


Zespolona KlasaPosredniczaca::Daj(int Indeks){

    return TabStosu[Indeks];

}


class KlasaGlowna{

    private:

    KlasaPosredniczaca Stos;

    public: 

        Zespolona DodajDwie();

        Zespolona MnozDwie();  

};


Zespolona KlasaGlowna::DodajDwie(){

    return Stos.TabStosu[Indeks-1]=Stos.TabStosu[Indeks]+Stos.TabStosu[Indeks-1];

}

Problem:

Wywołując w main() funkcje "KlasaGlowna.DodajDwie()" otrzymuje wynik-śmieci. Problem jest pomiędzy KlasaPosredniczaca a KlasaGlowna(dane się właśnie nie przekazują), jak to się powinno robić?

(oczywiście po drodze są przęciążenia wejscia/wyjscia, znaku +/* - działające dobrze(sprawdzone))


(Pkolaczk) #2

Debuggera nie masz? Na oko z kodem jest wszystko ok. Problem leży raczej poza tym co wkleiłeś. Jesteś pewien, że indeksem nie wyjeżdżasz poza rozmiar stosu?


(Takijeden89) #3

Indeksu nie przekroczyłem. Już to tak wytestowałem/zmodyfikowałem, że nie mam prawie gdzie;P.

Cały kod programu w wersji testowej(kompilujący się, wideć te wyniki-śmieci):

# include 


using namespace std;


# define ROZMIAR 10


int Indeks=2;


class Zespolona{

    //private:

    public:

        float Re;

        float Im;


    public:

        //przeciazenie dla dodawania dwoch liczb zespoloncyh

        Zespolona operator +(Zespolona Z){

            Zespolona Suma;

            Suma.Re=Re+Z.Re;

            Suma.Im=Im+Z.Re;

            return Suma;

        }        

        Zespolona operator -(Zespolona Z){

            Zespolona Suma;

            Suma.Re=Re-Z.Re;

            Suma.Im=Im-Z.Re;

            return Suma;

        }       

        Zespolona operator *(Zespolona Z){

            Zespolona Iloczyn;

            Iloczyn.Re=Re*Z.Re-Im*Z.Im;          

            Iloczyn.Im=Re*Z.Im+Im*Z.Re;                     

            return Iloczyn;

        }

        Zespolona operator /(Zespolona Z){

            Zespolona Iloraz;

            Iloraz.Re=(Re*Z.Re+Im*Z.Im)/

                      (Z.Re*Z.Re+Z.Im*Z.Im); 

            Iloraz.Im=(Im*Z.Re-Re*Z.Im)/

                      (Z.Re*Z.Re+Z.Im*Z.Im);            

            return Iloraz;

        }

    };


//Przeciazenie operatora wejswcia


istream & operator >> (istream & StrmWej, Zespolona & Z){

    char Znak;

    StrmWej>>Z.Re;

    StrmWej>>Znak;

    if(!(Znak=='+'||Znak=='-')){cerr<<"niepoprawny format (1)";exit(1);}

    StrmWej>>Z.Im;

    if(Znak=='-'){Z.Im=-Z.Im;}

    StrmWej>>Znak;

    if(Znak!='i'){cerr<<"niepoprawny format (2)";}


    return StrmWej;

}


//Przeciazenie operatora wyjscia

ostream &operator <<(ostream &ostrm, Zespolona Z){

    if(Z.Im<0){

        return ostrm <
    }else{

        return ostrm <
    }

}

class KlasaPosredniczaca{

    public:

        Zespolona TabStosu[ROZMIAR];

    public:

        void Zapisz(Zespolona Z);

        Zespolona Daj(int Indeksik);

};


void KlasaPosredniczaca::Zapisz(Zespolona Z){

    TabStosu[Indeks++]=Z;

}


Zespolona KlasaPosredniczaca::Daj(int Indeks){

    return TabStosu[Indeks];

}


class KlasaGlowna{

    //private:

    public:

    KlasaPosredniczaca Stos;

    public:  

        Zespolona DodajDwie();

        Zespolona MnozDwie();  

};


Zespolona KlasaGlowna::DodajDwie(){

    return Stos.Daj(Indeks)+Stos.Daj(Indeks-1);

    //return Stos.TabStosu[Indeks-1]=Stos.TabStosu[Indeks]+Stos.TabStosu[Indeks-1];

}

Zespolona KlasaGlowna::MnozDwie(){

    return Stos.TabStosu[Indeks-1]=Stos.TabStosu[Indeks]*Stos.TabStosu[Indeks-1];

}


void WyswietlMenu(){

    cout<<"This is MENU"<
}  


int main(){


Zespolona Z;

KlasaPosredniczaca KP;

KlasaGlowna KG;


KP.TabStosu[0].Re=2;

KP.TabStosu[0].Im=2;

KP.TabStosu[1].Re=5;

KP.TabStosu[1].Im=-3;

KP.TabStosu[2].Re=4;

KP.TabStosu[2].Im=4;

KP.TabStosu[3].Re=5;

KP.TabStosu[3].Im=5;



WyswietlMenu();


cout<<"Mnoż: "<
cout<<"Dodaj: "<
cout<<"\nTablica z KlasyPosredniczacej: "<
cout<<"Tablica poprzez KlaseGlowna: "<
cout<<"Daj: "<


 cin>>Z;

return 0;    

}

Debugger? Jeszcze gdybym wiedział jak go zastosować przy tym problemie.


(Sawyer47) #4

Definiujesz obiekt KlasaGlowna KG; ale nie wpisujesz tam żadnych danych, więc wszelkie operacje na tym obiekcie nie mają sensu. że nie wspomnę już o używanie zmiennej globalnej wewnątrz klasy...


(Zulowski) #5

Hmm, jak to jak, dodajesz zmienne których wartość Cię interesuje, ustawiasz sobie break-pointa zaraz przed rozpoczeciem dzialan na nich, i wykonujesz krok po kroku, sprawdzając wartosci i wykonywanie kodu...

Chyba jedno z najprostszych zastosowań.