Seuraava esimerkki näyttää miten referenssin (viitteen) palauttamista voitaisiin käyttää "turvallisen" taulukon tekemiseen.
/* 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, "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;
}