Prev Next Up Title Contents Index

Referenssin palauttaminen


Seuraava esimerkki näyttää miten referenssin (viitteen) palauttamista voitaisiin käyttää "turvallisen" taulukon tekemiseen.

retref.cpp - refenssin palauttaminen

	/* RETREF.CPP - referenssin palauttaminen, "turva"taulukko */
	#include <stdio.h>
	
	class cTaulukko {
	  int *t;
	  int koko;
	  int laiton;
	public:
	  cTaulukko(int k);
	  ~cTaulukko() { if (koko) delete [] t; }
	
	  int get(int i) const {
	    if ( ( i < 0 ) || ( koko <= i ) ) return laiton;
	    return t[i];
	  }
	
	  int &put(int i) {
	    if ( ( i < 0 ) || ( koko <= i ) ) {
	      printf("Laiton taulukon indeksi %d!\n",i);
	      return laiton;
	    }
	    return t[i]; // Palautetaan viittaus t[i]:hin!
	  }
	
	  void tulosta() const;
	};
	
	void cTaulukko::tulosta() const {
	  for (int i=0; i<koko; i++) printf("%5d",t[i]);
	  printf("\n");
	}
	
	cTaulukko::cTaulukko(int k)
	{
	  koko = 0; laiton = 0;
	  if ( k <= 0 ) return;
	  t = new int[k];  
	  if ( !t ) return;
	  koko = k;
	  for (int i=0; i<=koko; i++) t[i] = 0;
	}
	
	int main(void)
	{
	  cTaulukko a(5);
	  a.tulosta();
	  a.put(2) = 5;       // HUOM!  Muoto a.put(2,5) olisi parempi!
	  a.put(4) = 3;
	  a.tulosta();
	  a.put(9) = 7;
	  a.tulosta();
	
	  return 0;
	}
Vielä enemmän taulukon näköinen "olio" saadaan lisämäärittelemällä luokalle []-operaattori:

retref2.cpp - referenssin palauttaminen []-operaattorilla

	/* RETREF2.CPP - referenssin palauttaminen, "turva"taulukko */
	...
	class cTaulukko {
	...
	public:
	...
	  int &operator[] (int i) {
	    if ( (i<0) || (i>=koko) ) {
	      printf("Laiton taulukon indeksi %d!\n",i);
	      return laiton;
	    }
	    return t[i]; // Palautetaan viittaus t[i]:hin!
	  }
	...
	};
	
	
	int main(void)
	{
	  cTaulukko a(5);
	  a.tulosta();
	
	  a[3] = 3;
	  a.tulosta();
	  printf("a[1] = %d\n",a[1]);
	  a[8] = 175;
	  a.tulosta();
	  printf("a[8] = %d\n",a[8]);
	
	  return 0;
	}

Tehtävä 1.32 Referenssin palauttaminen

Miksi RETREF2.CPP toimii?


Prev Next Up Title Contents Index