2.10.2 Tietueet ja kentät

C++-kielessä tietueiden määrittelyssä käytetään varattua sanaa struct. Esimerkiksi

struct kilpailija {
  string nimi;
  int numero;
};                  // Huomaa puolipiste!

määrittelee tietuetyypin nimeltä kilpailija, jossa on kaksi kenttää: merkkijono nimi ja kokonaisluku numero. Tämän jälkeen tunnusta kilpailija voidaan käyttää muuttujien määrittelyyn, kuten mitä tahansa tyypin tunnusta:

kilpailija voittaja;

Muuttuja voittaja on nyt tietuemuuttuja, jonka kenttiin yhden kilpailijan tiedot tallennetaan:

Huomaa, että kilpailija on todellakin tyyppi eikä muuttuja. Sitä siis käytetään aivan samoin kuin kielen valmiiksi määriteltyjä tyyppejä (int, double, char, ...):

int pituus, koko1, koko2;
kilpailija kilp1, kilp2, jumbo;

Tämän jälkeen kilp1, kilp2 ja jumbo ovat tietuetyyppisiä muuttujia.

Tietuemuuttujan kenttiin viitataan antamalla tietuemuuttujan nimi ja kentän nimi pisteellä erotettuna. Edellisen esimerkin muuttuja voittaja koostuu siis kahdesta kenttämuuttujasta voittaja.nimi ja voittaja.numero, joista ensimmäinen on merkkijono ja toinen kokonaisluku. Kumpaankaan ei voi viitata ilman, että mainitaan myös voittaja-muuttuja. Vastaavasti muuttuja kilp1 koostuu kenttämuuttujista kilp1.nimi ja kilp1.numero, joilla ei ole mitään tekemistä voittaja:n vastaavien kenttien kanssa. Kentät ovat olemassa vain tietuemuuttujan sisällä, eikä siten haittaa mitään, vaikka eri muuttujilla on täsmälleen samannimiset kentät.

Kenttämuuttujia käsitellään aivan samoin kuin mitä tahansa vastaavan tyyppisiä muuttujia. Esimerkiksi, jos määritellään

struct paivamaara {
  int pp, kk, vvvv;
};
...
paivamaara tanaan;

niin muuttujalla tanaan on kolme kokonaislukutyyppistä kenttää:

Tällöin kenttämuuttujilla tanaan.pp, tanaan.kk ja tanaan.vvvv voidaan tehdä täsmälleen samoja asioita kuin vaikkapa yksinkertaisella kokonaislukumuuttujalla luku: Niihin voidaan sijoittaa tai lukea arvoja, niitä voidaan käyttää lausekkeiden osana tai funktioiden argumentteina, niiden sisältö voidaan tulostaa, jne.

Pääsääntöisesti tietuemuuttujia käsitellään siis kentittäin. Esimerkiksi kokonaisten tietueiden lukeminen, tulostus tai vertailu eivät ole sallittuja. On kuitenkin tilanteita, joissa tietuetta voidaan käsitellä yhtenä kokonaisuutena. Tietuemuuttuja voidaan alustaa esittelyn yhteydessä:

paivamaara tanaan = {1, 12, 2000};

Tämän jälkeen tilanne on seuraava:

Esittelyn jälkeen ei vastaavanlaista sijoitusta voi enää tehdä, vaan arvot on sijoitettava kentittäin:

tanaan.pp = 1;
tanaan.kk = 12;
tanaan.vvvv = 2000;

Toisen täsmälleen samantyyppisen tietuemuuttujan sisältö voidaan kuitenkin sijoittaa suoraan:

paivamaara synt_paiva, tanaan = {14, 5, 1990};
synt_paiva = tanaan;

Tämän sijoituksen jälkeen tilanne on aivan sama kuin se olisi sijoitusten

synt_paiva.pp = tanaan.pp;
synt_paiva.kk = tanaan.kk;
synt_paiva.vvvv = tanaan.vvvv;

jälkeen.