9.3.8 Sisäinen tilan valvonta
Emme edelleenkään ole ottaneet kantaa siihen, mitä tapahtuu, jos
joku yrittää alustaa oliomme mielettömillä arvoilla, esim:
cAika a1(42,175);
Toisaalta miten joku voisi muuttaa ajan arvoa muutenkin kuin lisaa-
metodilla? Teemmekin aluksi metodin aseta, jota kutsuttaisiin
a1.aseta(12,15); a2.aseta(16);
Nyt pitää kuitenkin päättää mitä tarkoittaa
laiton asetus! Jos sovimme että minuuteissa yli 59 arvot ovat aina 59 ja
alle 0:n arvot ovat aina 0, voisi aseta- metodi olla kirjoitettu
seuraavasti:
void aseta(int ih,int im=0) {
h = ih; m = im;
if ( m > 59 ) m = 59;
if ( m < 0 ) m = 0;
}
Jos taas haluaisimme, että ylimääräinen osuus siirtyisi
tunteihin, voitaisiinkin tämä tehdä "kierosti" lisaa-
metodin avulla
olioalk\aikacla4.cpp - sisäinen tilan valvonta asetuksessa
#include <iostream.h>
#include <iomanip.h>
class cAika {
int h,m;
public:
void aseta(int ih,int im=0) {
h = ih; m = im; lisaa(0);
}
cAika(int ih=0, int im=0) { aseta(ih,im); }
void lisaa(int lisa_min) { ... }
void tulosta() const { ... }
};
int main(void)
{
cAika a1, a2(13), a3(14,25);
a1.tulosta(); a2.tulosta(); a3.tulosta();
a1.aseta(12,15); a2.aseta(16,-15);
a1.tulosta(); a2.tulosta();
return 0;
}
Huomattakoon, että samalla kun tehdään aseta- metodi,
kannattaa muodostajassakin kutsua sitä. Näin olion tilaa muutetaan
vain muutamassa metodissa, jotka voidaan ohjelmoida niin huolella, ettei
mitään yllätyksiä pääse koskaan tapahtumaan.
Tämä rupeaa jo muistuttamaan olio- ohjelmointia!
- Mitä ohjelma aikacla4.cpp tulostaisi? Miksi ohjelma toimisi halutulla
tavalla?
- Ohjelmoi myös tunneille tarkistus, missä pidetään huoli
siitä, että tunnit ovat aina välillä 0-23.