14.5.3 Tietueet osoitteiden avulla tai viitteiden avulla
Usein
tietueet ja oliot välitetään osoitteiden tai viitteiden avulla,
vaikkei niitä olisikaan tarkoitus muuttaa aliohjelmassa. Tähän
on syynä se, että parametrin välityksessähän
kopioidaan kutsumuuttujien arvot aliohjelman lokaaleihin muuttujiin.
Tietueiden tapauksessa kopiointi saattaa olla isokin, ja tämän vuoksi
osoitteen välityksessä menee pelkkä osoite, ei koko tietueen
sisältö.
int vertaa_pvm(Pvm_tyyppi pv1, Pvm_tyyppi pv2)
{
...
}
...
int ero;
Pvm_tyyppi pvm1,pvm2;
ero = vertaa_pvm(pvm1,pvm2); /* Oikein, mutta iso kopiointi */
if ( ero < 0 ) printf("Pvm1 on ensin!\n");
Parametrin välitys osoitteiden avulla kopioinnin välttämiseksi:
int vertaa_pvm(Pvm_tyyppi *pv1, Pvm_tyyppi *pv2)
{
...
}
...
int ero;
Pvm_tyyppi pvm1,pvm2;
ero = vertaa_pvm(&pvm1,&pvm2); /* Oikein */
if ( ero < 0 ) printf("Pvm1 on ensin!\n");
Tällöin tietysti aliohjelman kirjoittajan on oltava huolellinen,
ettei muuta pv1 ja pv2 osoitteiden osoittamia
päivämääriä! Usein tätä kommentoidaan
const esittelyllä:
int vertaa_pvm(const Pvm_tyyppi *pv1, const Pvm_tyyppi *pv2)
{
...
}
...
- Kirjoita aliohjelma vertaa_pvm, joka palauttaa - 1, mikäli
pv1 on ennen pv2:sta, 0 jos
päivämäärät ovat samoja ja 1 muuten.
- Täydennä pvmjono.cpp:ssä luokkaan cPvm myös
metodi vertaa(const cPvm &pv2), joka toimii kuten edellinen
vertaa_pvm, mutta verrattavina ovat *this ja
pv2.