Kezdőoldal » Számítástechnika » Programozás » Miért 0 lesz az eredmény a...

Miért 0 lesz az eredmény a kiíratáskor?

Figyelt kérdés

# 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;

}


2012. máj. 7. 19:37
1 2
 11/19 anonim ***** válasza:
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
2012. máj. 7. 19:57
Hasznos számodra ez a válasz?
 12/19 A kérdező kommentje:

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

2012. máj. 7. 20:02
 13/19 A kérdező kommentje:

Megyek enni mert ideges vagyok majd jövök.

Azért próbáljatok rájönni,hogy mi lehet a baj.

2012. máj. 7. 20:03
 14/19 anonim ***** válasza:

#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.

2012. máj. 7. 21:16
Hasznos számodra ez a válasz?
 15/19 iostream ***** válasza:

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.

2012. máj. 7. 21:17
Hasznos számodra ez a válasz?
 16/19 anonim ***** válasza:

@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;

}

2012. máj. 7. 21:28
Hasznos számodra ez a válasz?
 17/19 A kérdező kommentje:

"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?

2012. máj. 8. 00:46
 18/19 anonim ***** válasza:

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.

2012. máj. 8. 01:54
Hasznos számodra ez a válasz?
 19/19 anonim ***** válasza:

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

2012. máj. 8. 15:39
Hasznos számodra ez a válasz?
1 2

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!