Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Olion uudelleen luonti

kayttaja-3842 [05.11.2014 10:52:46]

#

Törmäsin mielenkiintoiseen "tapahtuma sarjaan" koodissani ja mietityttää tuon oikeellisuus.

Eli minulla on parent luokka A, joka luo itselleen child olion luokasta B. B saatua eventti kutsutaan event -metodia.
Näin ollen B käskee A:ta tuhoamaan itsensä(B) ja luomaan uudelleen. Kuitenkin stackiä katsoaessa olemme vielä metodin event sisällä.
_parent->Create -metodi kutsun jälkeen ajetaan vielä Logiin kirjaus. Tämä tapahtuu kuitenkin jäsen funktion sisällä mitä ei ole enää olemassa.

Koodi toimii kyllä näin, mutta mietin vaan että onko toi kuitenkaan suositeltavaa?

  class A
{

public:
 A() : object( NULL )
 {
   this->Create( this );
 }

public:
 void Create( parent )
 {
  delete object;

  object = new B( parent );
 }

private:

B *object;

};

class B
{
public:
 B( A *parent )
 {
   _parent = parent;
 }

public:
 void event()
 {
   _parent->Create( _parent );

   LOG( "Deleted" );
 }

private:
 A *_parent;

};

Grez [05.11.2014 11:22:38]

#

kayttaja-3842 kirjoitti:

Tämä tapahtuu kuitenkin jäsen funktion sisällä mitä ei ole enää olemassa.

Funktiothan on ohjelmakoodia jotka on kertaalleen siellä ohjelmassa ja ne oletettavasti on olemassa niin kauan kuin ohjelma on muistissa. Ei niistä tehdä kopioita jokaiselle luokan oliolle erikseen.

Toki se looginen omituisuus tuossa on, että "olion funktioiden" pitäisi aina pystyä viittaamaan olioon, ja näin ei tässä tapauksessa siis ilmeisesti ole.

Sinänsä koko tuo viritelmä näyttää sellaiselta että ilman todella hyviä perusteita sen olemassaololle heittäisin sen huitsin nevadaan. Vähintäänkin funktioiden uudelleennimeämiselle tms. refaktoroinnille olisi tarvetta.

kayttaja-3842 [05.11.2014 12:16:13]

#

Kirjoitin tuon yksinkertaiseksi esimerkiksi, koska en alkuperäistä koodia halunnut tänne laittaa. Ko. toiminnolle on mielestäni kyllä hyvät perusteet koodin toteutustapaa silmällä pitäen. Itse en ole ko. tilanteeseen koskaan ennen törmännyt juurikin tuon oudon toteutus tavan takia. Koodi ei ole alunperin minun tekemäni vaan minun piti pieni nopea korjaus koodiin saada.

Metabolix [05.11.2014 14:48:28]

#

Koodi ei ehkä ole suositeltava mutta todennäköisesti toimii kaikissa tavanomaisissa ympäristöissä. Funktiolla B::event ei ole mitään syytä käsitellä B:n jäseniä A::Create-funktiokutsun jälkeen, joten ei haittaa, vaikka this-osoitin olisi rikki. Koodin rakenne on erittäin arveluttava; uuden olion luonti saattaisi sopia paremmin sinne, missä funktiota B::event kutsutaan.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta