Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Luokat, oliot, perintä ym

karvinen [27.05.2022 12:32:05]

#

Amk c++ ohjelmointikurssia yrittää paukuttaa päähän.

Luokkien teko onnistuu, niihin funktioiden teko onnistuu, olioilla funktioiden kutsuminen onnistuu.

Mutta mistä löytäisin yksinkertaisesti selitettynä, miksi noita pitäisi käyttää(joo koodin selkeyden vuoksi).

ja miten niitä kannattaa käyttää.

En oikeen tiedä, millä hakusanalla lähtisi esim youtube videota hakemaan, en niinkään kaipaa koodiesimerkkejä, vaan niin että tuo prosessi selitettäisiin rautalangasta vääntäen.

Se on siinä ja siinä, että sen saisi sisäistettyä kunnolla, mutta vielä tarvitsisi rautalangasta väännetyn yksinkertaisen ja avaavan luennon.

Grez [27.05.2022 13:53:02]

#

karvinen kirjoitti:

Mutta mistä löytäisin yksinkertaisesti selitettynä, miksi noita pitäisi käyttää(joo koodin selkeyden vuoksi).

Olioiden käyttäminen sinänsä jakaa mielipiteitä. Esim. https://www.youtube.com/results?search_query­=object oriented programming is bad

Mutta yleisesti ottaen kullakin kielellä on tapansa tehdä asiat. Kun kaikki koodaajat tekevät samalla tavalla, niin sitten jokainen myös ymmärtää paremmin muiden kirjoittamaa koodia, joka helpottaa yhteistyötä ja parantaa ylläpidettävyyttä.

Toki esim. C++:lla on mahdollista kirjoittaa koodia ilman luokkia ja olioita (tai vaikka ilman funktioitakin) mutta sitten voi ihmetellä miksi ylipäätään käyttää c++:aa, eikä esim. perus c:tä.

Metabolix [28.05.2022 12:28:34]

#

Luokkien käyttö on isolta osin ideologinen kysymys. Joskus siitä on hyötyä, joskus siitä on vaivaa. Usein tärkein syy ratkaisulle on se, miten joku on tottunut tekemään tai minkä joku uskoo parhaaksi tavaksi.

Lisäksi kysymyksen voi tulkita eri tavoin: pelkästään class-sana koodissa ei tee koodista olio-ohjelmointia, ja toisaalta olio-ohjelmointi on mahdollista funktioiden ja osoitinten avulla vaikka C:ssä, vaikka siinä ei ole (kielen tasolla) luokkia.

Yksi hyvin käytännöllinen C++:n luokkien hyöty on se, että resurssit saa automaattisesti vapautettua lohkon (kuten funktion) lopussa. C-koodissa on aika yleistä, että esimerkiksi virhetilanteissa jotain jää vapauttamatta, ja luokkien avulla tämä ongelma vältetään.

Esimerkiksi väliaikaiset muistipuskurit pitää C:ssä varata ja vapauttaa joka tilanteessa itse:

void funktio_c() {
  char* dataa = malloc(10000);
  if (juttu1(dataa) == VIRHE) {
    free(dataa); // Muistetaan vapauttaa...
    return -1;
  }
  char* toinen_data = malloc(10000);
  if (juttu2(dataa, toinen_data) == VIRHE) {
    free(dataa); // Muistetaan vapauttaa molemmat...
    free(toinen_data);
    return -2;
  }
  int tulos = juttu3(dataa, toinen_data);
  free(dataa);
  free(toinen_data);
  return tulos;
}

Koodia voi järjestellä eri tavalla, jotta vapauttaminen olisi helpompaa, mutta silti puuttuva vapauttaminen – tai käänteisesti vapauttaminen liian aikaisin – on hyvin yleinen virhe C-koodissa.

Luokilla ongelman voi välttää:

void funktio_cpp() {
  std::vector<char> dataa(10000);
  if (juttu1(dataa.data()) == VIRHE) {
    return -1;
  }
  std::vector<char> toinen_data(10000);
  if (juttu2(dataa.data(), toinen_data.data()) == VIRHE) {
    return -2;
  }
  return juttu3(dataa.data(), toinen_data.data());
}

Tämä on myös esimerkki siitä, että luokan hyödyntäminen tähän yhteen tarkoitukseen ei tehnyt koodista varsinaisesti olio-ohjelmointia.

Vastaus

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

Tietoa sivustosta