Miért 0 lesz az eredmény a kiíratáskor?
# include <iostream>
class A
{
public:
void SetNumber(int age) {itsNumber = age;}
int GetNumber()const {return itsNumber;}
private:
int itsNumber;
};
class B
{
public:
A eler()const {return itsEler;}
private:
A itsEler;
};
int main()
{
B proba;
proba.eler().SetNumber(11); //Át állítom 11 re de mégis 0 lesz a ki íratásnál.
std::cout << proba.eler().GetNumber() << std::endl;
return 0;
}
A **** tudja mi lehet a baja ennek a *zarnak.Jól van meg írva aztán baszik működni. :S
proba.eler().SetNumber(11); //beállítom 11 re és 0 marad az értéke az itsNumbernek lol
Megyek enni mert ideges vagyok majd jövök.
Azért próbáljatok rájönni,hogy mi lehet a baj.
#include <iostream>
class A
{
public:
void SetNumber(int age) {itsNumber = age;}
int GetNumber()const {return itsNumber;}
private:
int itsNumber;
};
class B
{
public:
A* eler() {return &itsEler;}
private:
A itsEler;
};
int main()
{
B proba;
proba.eler()->SetNumber(11); //Át állítom 11 re de mégis 0 lesz a ki íratásnál.
std::cout << proba.eler()->GetNumber() << std::endl;
return 0;
}
Magyarázat: az eredeti megoldásban az eler függvény az itsEler másolatát adja vissza, így ha azt módosítjuk, akkor az eredeti változatlan marad.
Az a baj, hogy érték szerint lemásolod az A típusú objektumot az eler függvény visszatértekor. Tehát létrejön egy A átmeneti objektum, amin beállítod a 11-et, aztán az megszűnik.
Próbáld meg úgy, hogy A&-t adsz vissza, ekkor persze a const-ot le kell venni.
@21:16 ott a pont.
Kiegészítem egy két dologgal.
"az azért elég fura h neked 0 amíg nekem véletlenszerűen dob ki 7jegyű számokat :D akár const-tal akár nem :S"
Nem inicializált változó értékét kéri vissza, ami bármi lehet, a fordítóprogramtól és az OS memóriamenedzsmentétől függ az értéke.
itsEler-t lemásolja és a másolatot adja vissza. A másolatnak az a tagváltozója nem inicializált.
Létrehozza a másolatot majd megszünteti miközben az eredeti itsEler még nem szűnt meg.
Egy szemléletes példa mindig kiírja azt is, ha egy A tipusu objektum létejött vagy megszűnt.
# include <iostream>
class A
{
public:
A(){std::cout << "Egy a objektum letrehozva" << std::endl;}
~A(){std::cout << "Egy a objektum megszuntetve." << std::endl;}
void SetNumber(int age) {itsNumber = age;}
int GetNumber()const {return itsNumber;}
private:
int itsNumber;
};
class B
{
public:
A eler()const {return itsEler;}
//private:
A itsEler;
};
int main()
{
B proba;
proba.itsEler.SetNumber(11);
std::cout << proba.eler().GetNumber() << std::endl;
proba.itsEler.SetNumber(21);
std::cout << proba.eler().GetNumber() << std::endl;
proba.eler().SetNumber(31);
std::cout << proba.eler().GetNumber() << std::endl;
return 0;
}
"Tehát létrejön egy A átmeneti objektum, amin beállítod a 11-et, aztán az megszűnik."
Miért szűnik meg?
Mert ugyan az történik erre vonatkozóan mint egy sima függvény hívás esetében.
A függvényen belüli lokális változók a függvény meghívására létrejönnek, majd megszűnnek automatikusan a függvény lefutása után (arra nem vonatkozik ami dinamikusan van példányosítva ).
Pl
int a=7;
int f(){
int b;
return a;
}
Létrejön f() hívására b, létrejön egy ideiglenes "a" másolat, majd a függvény lefutása után a függvényen belüli változók megszűnnek.(Megszűnik "b" és "a" másolat) Csak itt nincs "meglepetés" mert az int-nek nincsennek metódusai.
return itsEler; nem itsEler valtozoval ter vissza hanem ennek ertekevel.
return &itsEler; mar a memoria cimmel ter vissza ahol ez a valtozo talalhato ezert kepes modositani az eredetit , nem egy masolatot
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!