Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Kuinka luoda staattinen C++ luokka

punppis [23.03.2011 19:56:46]

#

Olisi työn alla nyt peli ja asetuksia (mm. resoluutio) tarvii ympäri peliä, eri tiedostoissa. Yritin tehdä staattisen luokan, mutta kun includaan tuota tiedostoa ympäri koodia (tarvittavissa tiedostoissa siis), niin tulee valituksia, että muuttujia on määritelty jo (ei nyt ole koodia tässä kotikoneella, mutta LINKER erroria).

#ifndef CONFIG_H
#define CONFIG_H

class Config {
public:
    static const int muuttuja;
    static int muuttuja2;
};

int Config::muuttuja = 123;
int Config::muuttuja2 = 456;

#endif

Tuntuu siis, että tuo koodi ajetaan huolimatta tuosta ifndeffistä. Miten ihmeessä tämä kannattaisi nyt tehdä. Tällä hetkellä luokka on normaali non-staattinen, josta on sitten tehty yksi objekti, mutta tuntuu typerältä.

Edit: Nyt kun kotikoneella koitin puhtaalla projektilla niin hyvinhän tuo koodi toimii. Osaako joku sanoa jotain yleispätevää "koitappas tätä..." vai pitääkö ruveta miettimään olisiko koulumme pelimoottorilla jotain tekemistä asian kanssa.

Metabolix [23.03.2011 20:14:30]

#

Sinun pitää laittaa nuo jäsenten määrittelyt (alustusrivit) cpp-tiedostoon, kuten kaikki muutkin ohjelmien muuttujat. Muuten ne tulevat includen takia jokaiseen tuota luokkaa käyttävään cpp-tiedostoon uudestaan ja linkkeri valittaa toistuvasta määrittelystä. (Lue C++-oppaan osa 6.)

punppis [23.03.2011 20:19:12]

#

Kiitos vastauksesta!

Osaatko sanoa, miksi tuo koodi toimii hyvin (tällä kotikoneella), vaikka includaan tuon tiedoston kolmeen tiedostoon.

Metabolix [23.03.2011 21:21:17]

#

Käännätkö ne tiedostot erillisinä vai oletko liittänyt nekin includella yhteen? Includella kootussa ohjelmassa ongelmaa ei tietenkään tule (mutta usean cpp-tiedoston yhdistäminen includella on idealtaan väärä ratkaisu). Jos käännät tiedostot erillisinä ja koodi silti toimii, veikkaan bugia (tai "kätevää ominaisuutta") linkkerissä. Microsoftin kääntäjällä tuollainen ei olisi mikään yllätys. Myös GNU ld:lle voi antaa valinnan --allow-multiple-definitions, joka varmaankin ohittaisi virheen.

Tuossa mallikoodissasi on toinenkin virhe, jota kääntäjän ei varmasti pitäisi päästää läpi: ensimmäisen muuttujan esittelyssä on const mutta määrittelystä se puuttuu.

punppis [23.03.2011 22:38:45]

#

Const unohtui kun kirjotin koodin suoraan tänne putkaan.

Tiedostot siis käännetään erillisinä ja niihin includetaan eri .h-tiedostoja. Visual Studio 2010 käytössä.

Olenko ymmärtänyt tuon #ifndef toiminnan väärin, kun luulen että tuo koodi pitäisi suorittaa vain kerran. Vai onko tuo define toiminnassa vain tietyssä tiedostossa, jolloin jokaisessa cpp-käännöksessä tuo koodi ajetaan uudestaan.

Metabolix [23.03.2011 23:17:10]

#

Auttaisikohan tuon mainitsemani oppaan (6. osan) lukeminen alusta loppuun? Siellä on selitetty myös käännösyksiköistä ja liitosalueista ja ties mistä.

Kääntäjä kääntää yhden cpp-tiedoston kerrallaan, jokaisen puhtaalta pöydältä. Siis ifndef-lohkon käsittely tapahtuu joka tiedoston kohdalla erikseen. Linkkeri linkittää käännetyt koodit yhteen.

Vastaus

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

Tietoa sivustosta