Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Miksi private

Sivun loppuun

Jokotai [22.01.2011 13:10:54]

#

Käsittääkeni private ja public muuttujat tallentuvat samalla tavalla muistiin. Miksi niitä käytetään?

Grez [22.01.2011 13:26:42]

#

Privatea ei pysty luokan ulkopuoliset käpistelemään. Yleensä hyvin tehty luokka takaa, että sitä ei saa rikki publiceja säätämällä. (Sen takia yleensä public muuttujien asemesta käytetään public propertyjä, joille voi kirjoittaa validoinnin setteriin). Jos luokassa on privaattimuuttuja, niin luokka pystyy helposti takaamaan, että sen sisältö on järjellinen, koska luokan ulkpuolinen koodi ei pääse käpistelemään sitä.

Metabolix [22.01.2011 13:30:47]

#

Luitko opasta?

C++-oppaan 9. osa kirjoitti:

Yksi olio-ohjelmoinnin periaatteista on, että jokaisen olion täytyy säilyttää tilansa järkevänä, ja tämä ei onnistu, jos ohjelmoija voi milloin tahansa olion ulkopuolelta muuttaa sen tietoja hallitsemattomasti.

Voisi olla esimerkiksi luokka, joka sisältää kulman ja sitä vastaavan pisteen (x, y) yksikköympyrän kehällä. Jos nämä kaikki olisivat julkisia, luokan käyttäjä voisi asettaa niihin arvoja, jotka eivät päde. Siksi näistä tehdään yksityisiä ja asettamiseen käytetään erillisiä funktioita, joista toinen asettaa kulman ja laskee samalla pisteen ja toinen vastaavasti asettaa pisteen, normalisoi sen ja laskee samalla kulman.

#include <cmath>

class yksikkoympyran_piste {
    double x_, y_, kulma_;
public:
    double x() const { return x_; }
    double y() const { return y_; }
    double kulma() const { return kulma_; }

    void aseta(double kulma) {
        x_ = std::cos(kulma);
        y_ = std::sin(kulma);
        kulma_ = std::atan2(y_, x_);
    }
    void aseta(double x, double y) {
        kulma_ = std::atan2(y, x);
        x_ = std::cos(kulma_);
        y_ = std::sin(kulma_);
    }
};

Jokotai [22.01.2011 14:08:25]

#

Jaa, jaa. Nyt valkeni. Aika turhaa tosin.

eq [22.01.2011 15:28:41]

#

Jokotai kirjoitti:

Jaa, jaa. Nyt valkeni. Aika turhaa tosin.

Missä mielessä turhaa?

Millä tavalla muuttujat voisivat olla ratkaisevasti "eri tavalla" muistissa?

Jokotai [22.01.2011 15:39:03]

#

eq kirjoitti:

Missä mielessä turhaa?

Hyvin suunnitellussa ohjelmassa nuo ovat turhia, tietenkin jos sitä ei ole suunniteltu hyvin, niin asia on toinen, mutta lähtökohtaisesti ohjelma pitäisi suunnitella niin hyvin, että nuo olisivat turhia.

eq kirjoitti:

Millä tavalla muuttujat voisivat olla ratkaisevasti "eri tavalla" muistissa?

Ei voikaan ja siksi kummastelinkin.

Metabolix [22.01.2011 15:44:41]

#

Jokotai, hyvin suunnitellussa ohjelmassa niitä juuri käytetään. Ohjelmoijat eivät voi lukea toistensa ajatuksia, joten ne ajatukset pitää kirjata jollain tavalla koodiin. Tämä on C++:n (ja lukuisten muiden kielten) tapa kirjoittaa koodiin "älä muuta tätä arvoa" tai "älä käytä tätä funktiota". Erityisesti kirjastojen kohdalla tällaiset tiedot ovat välttämättömiä. Niistä on sitä paitsi hyötyä käyttäjällekin: jos etsii kirjastosta funktiota tiettyyn tarkoitukseen, ei tarvitse tutkia kaikkia kirjaston sisäisiä apufunktioita vaan vain julkiset funktiot.

Kannattaa olla arvostelematta tällaisia asioita, kun ei ole itse koodannut koskaan mitään isoa.

Grez [22.01.2011 15:49:20]

#

Jokotai kirjoitti:

Hyvin suunnitellussa ohjelmassa nuo ovat turhia

Privaatit kuuluvat nykyisin hyvään suunnitteluun, joten tämä väite on suunnilleen yhtä järkevä kuin: "Hyvin suunnitellussa ohjelmassa funktiot ovat turhia."

Joo, suunnittelulla ja kovalla koordinaatiolla voi toki kirjoittaa ohjelman, jossa ei ole funktioita (sen mainin lisäksi), mutta mm. sellaisen ylläpidettävyys olisi totaalisen surkea. Sama olisi jos välttäisi privaattimuuttujia.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta