Prev Next Up Title Contents Index

Muodostajan ja hajottajan kutsuminen


Seuraava esimerkki kuvannee muodostajan (rakentaja) ja hajottajan (hävittäjä) kutsujärjestystä:

conorder.cpp - malli konstruktorien kutsujärjestyksestä

	/* CONORDER.CPP */
	#include <stdio.h>
	#include <string.h>
	#include <conio.h>
	
	
	#define RIVEJA 14
	
	class cMalli {
	  int  luku;
	  char nimi[10];
	  static int rivi;  // Tulostusrivien laskuri
	public:
	  cMalli(int i=0, char *s="?") {
	    luku = i; strcpy(nimi,s);
	    tulosta("Rakentaja");
	  }
	
	  ~cMalli() { tulosta("Hävittäjä"); }
	
	  void tulosta(char *s="???") const {
	    rivi++;
	    if (rivi>RIVEJA) gotoxy(40,1+rivi-RIVEJA);
	    else gotoxy(1,1+rivi);
	    printf("%2d %-10s: %-10s %3d\n",rivi,s,nimi,luku);
	  }
	  void vaihda(int i) { luku = i; tulosta("Vaihto");}
	};
	
	int cMalli::rivi = 0; // ks. luokkamuuttujat
	
	int main(void)
	{
	  clrscr();
	  printf("--------------------------------------------------------\n");
	  //                                                           rivinro
	  cMalli m1(1,"m1");                                           // # 1
	  cMalli *p,*a;
	  cMalli t[3]={                                                // # 2-4
	    cMalli(10,"t[0]"),cMalli(11,"t[1]"),cMalli(12,"t[2]")
	  };
	  {
	    m1.tulosta("Onko muita");                                  // # 5
	    cMalli m2(2,"m2");                                         // # 6
	    m2.tulosta("Nyt on 2");                                    // # 7
	    {
	      cMalli m3(3,"m3");                                       // # 8
	      m3.tulosta("Nyt 3");                                     // # 9
	      p = new cMalli(4,"*p");                                  // #10
	
	    }                                                          // #11
	  }                                                            // #12
	
	  a = new cMalli[3];                                           // #13-15
	  delete p;                                                    // #16
	  a[1].tulosta("Dyn.taul.");                                   // #17
	
	  for (int i=0; i<3; i++) a[i].vaihda( (i+1)*100 );            // #18-20
	  a[1].tulosta("Dyn.taul.");                                   // #21
	  delete [] a;                                                 // #22-24
	  return 0;
	}                                                              // #25-28
Alla on ohjelman tulostus. Riveihin viitataan ohjelmakoodin kommenteissa:
	 1 Rakentaja : m1           1     |    15 Rakentaja : ?            0
	 2 Rakentaja : t[0]        10     |    16 Hävittäjä : *p           4
	 3 Rakentaja : t[1]        11     |    17 Dyn.taul. : ?            0
	 4 Rakentaja : t[2]        12     |    18 Vaihto    : ?          100
	 5 Onko muita: m1           1     |    19 Vaihto    : ?          200
	 6 Rakentaja : m2           2     |    20 Vaihto    : ?          300
	 7 Nyt on 2  : m2           2     |    21 Dyn.taul. : ?          200
	 8 Rakentaja : m3           3     |    22 Hävittäjä : ?          300
	 9 Nyt 3     : m3           3     |    23 Hävittäjä : ?          200
	10 Rakentaja : *p           4     |    24 Hävittäjä : ?          100
	11 Hävittäjä : m3           3     |    25 Hävittäjä : t[2]        12
	12 Hävittäjä : m2           2     |    26 Hävittäjä : t[1]        11
	13 Rakentaja : ?            0     |    27 Hävittäjä : t[0]        10
	14 Rakentaja : ?            0     |    28 Hävittäjä : m1           1
Mikäli a -taulukon tuhoamisessa ei olisi ollut taulukkomerkintää delete [] a;, ei a:n jokaista alkiota kohti olisi kutsuttu vastaavaa hajottajaa.

Tehtävä 1.13 new:llä luotu ei häviä itsekseen!

Todista seuraava (sopivalla malliohjelmalla): globaalin tai lokaalin objektin hajottaja (destructor) suoritetaan kun muuttuja lakkaa olemasta. Kuitenkin mikäli muuttuja on osoite olioon, hajottaja suoritetaan vain delete komennolla. Mitä tästä voi olla haittaa?


Prev Next Up Title Contents Index