Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Olion funktiot

tkok [02.02.2009 20:23:50]

#

Onko sallittu tehdä tollanen funktio vai voiko tulla ongelmia?

class Piste{
    public:
        int x;
        int y;
    void AsetaKoordinaatit(x , y){}
};

vai pitääkö tehdä näin:

class Piste{
    public:
        int x;
        int y;
    void AsetaKoordinaatit(int xa, int ya){
        x=xa;
        y=ya;
        }
};

petrinm [02.02.2009 20:37:38]

#

Kyllä aina muuttajilla tyypit pitää olla määritelty.

tkok [02.02.2009 20:39:51]

#

Mutta siis kysyhän ei ollut tyypityksestä. Vaan siitä, että voinko suoraan Funktion otsikkorivillä tehdä tarvittavat sijoitukset jo olemassa oleviin muuttujiin?

petrinm [02.02.2009 20:43:44]

#

Ei. Ainoaksi poikkeukseksi funktioiden kanssa voisi laskea olion luonnissa tapahtuvan alustuksen. Muuten kaikkien funktioiden on toteuttava samaa perusfunktion "kaavaa".

class Piste{
    public:
        int x;
        int y;
        Piste(int x, int y) : x(x), y(y) { }
};

Grez [02.02.2009 20:46:05]

#

tkok kirjoitti:

Mutta siis kysyhän ei ollut tyypityksestä. Vaan siitä, että voinko suoraan Funktion otsikkorivillä tehdä tarvittavat sijoitukset jo olemassa oleviin muuttujiin?

Eihän siinä ensimmäisessä esimerkissä mitään sijoituksia edes tehty missään kohtaa. Nuo funktion muuttujat x ja y vain peittävät luokan saman nimisten muuttujien näkyvyyden ko. funktiossa.

Ja vaikka ne ovatkin saman nimisiä, niin ne voivat silti olla tyypiltään eri. Eli sen vuoksi sille funktiolle täytyy määrittää niiden tyypit vaikka jossain muualla ohjelmassa olisikin saman nimisiä muuttujia.

tkok [02.02.2009 21:00:47]

#

Grez kirjoitti:

]Eihän siinä ensimmäisessä esimerkissä mitään sijoituksia edes tehty missään kohtaa. Nuo funktion muuttujat x ja y vain peittävät luokan saman nimisten muuttujien näkyvyyden ko. funktiossa.

Tämä juuri minua askarutti, että peittävätkö ne funktion määrittelyt olion omat muuttujat x ja y, vai osaako se sijoittaa funktion kutsussa annetuilla muuttujilla olion omat x ja y.

Kiitos vastauksista.

Metabolix [02.02.2009 21:30:12]

#

Pakko vielä ihmetellä, miksei tällaista voi esimerkiksi kääntäjän kanssa todeta parilla yksinkertaisella testillä:

// #define TAPA 1 // tai 2, 3, 4
class c {
public:
  int i;
  c(): i(0) {}
  #if TAPA == 1
    void f(i) {}
  #elif TAPA == 2
    void f(int i) {}
  #elif TAPA == 3
    void f(int i) {i = i;}
  #elif TAPA == 4
    void f(int j):  i(j) {}
  #elif TAPA == 5
    void f(int j) {i = j;}
  #endif
};
#include <stdio.h>
int main() {
  c a;
  printf("ensin %d, ", a.i);
  a.f(1);
  printf("sitten %d.\n", a.i);
}
bash$ for i in 1 2 3 4 5 ; do echo "TAPA $i:" ; g++ koe.cpp -DTAPA=$i && ./a.out ; done
TAPA 1:
koe.cpp:6: error: ‘i’ is not a type
TAPA 2:
ensin 0, sitten 0.
TAPA 3:
ensin 0, sitten 0.
TAPA 4:
koe.cpp: In member function ‘void c::f(int)’:
koe.cpp:12: error: only constructors take base initializers
TAPA 5:
ensin 0, sitten 1.

Vastaus

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

Tietoa sivustosta