Miksi tässä luokan pointterin osoite muuttuu, kun sitä haetaan this komennolla?
kyseessä on ikuinen looppi..
Koodi:
------------------------------------------
#include
class KoeLuokka
{
public:
void LuokanOsoite();
void LuokanOsoite2();
private:
int muuttuja;
};
void KoeLuokka::LuokanOsoite()
{
void *pointer = this;
printf("LuokanOsoite:: Luokan osoite: %d\n",&pointer);
this->LuokanOsoite2(); //Rekursiivinen looppi
}
void KoeLuokka::LuokanOsoite2()
{
void *pointer = this;
printf("PalautaLuokanOsoite:: Luokan osoite: %d\n",&pointer);
this->LuokanOsoite(); //Rekursiivinen looppi
}
void main()
{
KoeLuokka testi_luokka;
testi_luokka.LuokanOsoite();
}
kyseessä on ikuinen looppi..
Koodi:
------------------------------------------
#include
class KoeLuokka
{
public:
void LuokanOsoite();
void LuokanOsoite2();
private:
int muuttuja;
};
void KoeLuokka::LuokanOsoite()
{
void *pointer = this;
printf("LuokanOsoite:: Luokan osoite: %d\n",&pointer);
this->LuokanOsoite2(); //Rekursiivinen looppi
}
void KoeLuokka::LuokanOsoite2()
{
void *pointer = this;
printf("PalautaLuokanOsoite:: Luokan osoite: %d\n",&pointer);
this->LuokanOsoite(); //Rekursiivinen looppi
}
void main()
{
KoeLuokka testi_luokka;
testi_luokka.LuokanOsoite();
}
Vastaukset 3
Vanhimmat
Käytät ihan turhaan kahta (lähes) samanlaista metodia. Itsensä kutsuminen on täysin sallittava toimenpide.
Ja toisekseen, et tarvitse this:iä mihinkään kutsuessasi saman luokan metodeja.
kyseessä oleva koodi on jotain ceen perua ja tuo this on c :ssa aika turhan oloinen. tuo pointerin osoitteen muutuminen selittynee sillä, että tuo rekursiopino kasvaa
että funktio kutsuu itseään. Koska funktion parametrit ladataan pinoon (stack) kutsuvaiheessa, voidaan joissakin tapauksissa saavuttaa fiksu tapa dynaamisesti säilyttää informaatiota pinossa (heti kun poistutaan pinosta parametrien vaativa muisti vapautuu) eikä tarvita monimutkaisia erillisiä tietorakenteita.
Tyypillisiä tehtäviä joita voidaan parhaiten tehdä rekursiivisesti on parserin teko (esim jonkun matemaattisen lausekkeen laskeminen) tai binääri puun läpikäynti.
MUTTA: rekursivinen funktio pitää AINA sisältää joku katkaisu-ehto (if-lause return). Muuten funktio kutsuu itseään äärettömän monta kertoo kunnes tulee pinon ylivuoto ja ohjelman suoritus loppuu siihen.
this-pointteri viittaa sihen olioon jonka koodia parhaillaan suoritetaan. Sitää ei tarvitse erikseen deklaroida, se on sisälletty C kieleen. Vaikka sitä voi käyttää lähes kaikkialla (ei aiheuta mitään vahinkoa) sen tavallisin käyttö on kun välitetään suoriutuvan olion osoite jollekin toiselle oliolle.