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.
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.)
Kiitos vastauksesta!
Osaatko sanoa, miksi tuo koodi toimii hyvin (tällä kotikoneella), vaikka includaan tuon tiedoston kolmeen tiedostoon.
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.
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.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.