Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Koodin rakenne/suunnittelu (C++)

Aruviel [20.04.2004 08:05:11]

#

No nyt on sanat ja aivosolut sekaisin. Vaikka olen jo jonkin verran tätä ohjelmointia harrastanut, niin nyt olisi kysymys niinkin yksinkertaisesta aiheesta kuin .h ja .c/.cpp tiedostoista.

Elikä: Minulla on tällä hetkellä käsissäni koodaamani "peli", joka nyt sitten sattuu sisältämään ~1000 riviä koodia, joka on kahdessa tiedostossa. Mutta minulla sananmukaisesti kuseee suunnittelu, ja olenkin aikeissa tehdä uusiksi tuon. Tarkemmin siinä suunnittelussa on huonoa se, kuinka ohjelman suoritus poukkoilee ympäri ämpäriinsä. Sitä on siis vaikea seurata.

Olen aikeissa siis tehdä homman uusiksi tämän vanhan työn pohjalta, mutta en halua tehdä samaa virhettä kuin nyt.

Elikäs, mitä kannattaa tunkea .h tiedostoihin ja mitä .cpp tiedostoihin? Kuinka projektin hajauttaminen onnistuu? Onko siihen jotain erityistä ohjetta? Olen aika sekaisin nyt näitten kanssa, enkä ilmeisesti osaa selvästi kysyä. Toivottavasti joku ymmärtää.

arcatan [20.04.2004 08:20:15]

#

No enpä varsinaisesti ole asiantuntija, mutta perusperiaate lienee, että .h-tiedostoihin funktioiden prototyypit (vai mikä se on, kuulutus?), globaalit, luokat ja structit (mikä se on suomeksi?). .cpp-tiedostoihin sitten tulee funktioiden ja luokkien itse koodi. Sitten kun kyseisiä funktioita tai luokkia halutaan käyttää, #include <tiedosto.h>.

pieslice [20.04.2004 11:54:14]

#

jos pystyt ajattelemaan jotain kokonaisuutta erillisenä (esim. vihollissysteemi, partikkelijärjestelmä)
jos pystyt ajattelemaan jotain asiaa erillisenä (esim. yksittäinen vihollinen), tee siitä luokka.

kaviaari [01.05.2004 09:52:31]

#

Ensin kannattaa tehdä peliluokka jossa on sisällä kaikki pelin tarvitsemat luokat kuten pelaaja,vihollinen,kenttä ja sitten luoda siitä olio, näin pelin kontrolointi on helppoa, globaalit muuttujat yleensä vain sotkevat peliä

Aruviel [06.05.2004 20:00:10]

#

Noniin, katsotaanpas.

Oletetaan, että minulla on kaksi funktioita, a(); ja b(); ja tiedostot a.h, a.cpp ja b.h, b.cpp. Miten tästä sitten jatketaan? Laitetaanko a.h -tiedostoon vain a(); ja sitten a.cpp -tiedostoon se koko a(); koodeineen?

Sitten minulla on tiedostot b.h ja b.cpp. b.h:ssa on b(); ja b.cpp:ssä koko b();. Entäs jos a(); funktiosta halutaankin kutsua b(); funktioita? Pitäisikö sitten vain sisällyttää b.h -tiedosto a.cpp -tiedostoon? (Eli #includettaa).

thefox [07.05.2004 10:08:56]

#

Kyllä, juuri niin. Katsos, kääntäjä ei tarvitse funktion kutsumiseen muuta kuin sen prototyypin (eli tuon b.h:ssa olevan b(); rivin [jonka tosin pitäisi määritellä myös paluuarvon tyyppi mutta ei takerruta pikkuseikkoihin]). Vasta linkkausvaiheessa kääntäjä etsii linkattavista kirjastoista ja objekteista itse funktiota, tässä tapauksessa se huomaa että funktio b() löytyy (esimerkiksi) objektista b.obj ja näin homma toimii. Ellei funktiota löydy mistään objektista, linkkeri tuottaa virheilmoituksen. Eli siis, tässä pieni esimerkki:

a.h

// include-vahteja kannattaa käyttää, ne varmistavat
// ettei tiedostoa sisällytetä useaan kertaan
#ifndef _MYPROJ_A_H_
#define _MYPROJ_A_H_

int a(int x);

#endif

a.cpp

int a(int x)
{
  return x * x;
}

b.h

#ifndef _MYPROJ_B_H_
#define _MYPROJ_B_H_

int b();

#endif

b.cpp

#include <cstdlib>

int b()
{
  return std::rand();
}

main.cpp

#include "a.h"
#include "b.h"

int main()
{
  a();
  b();
  return 0;
}

Aruviel [07.05.2004 13:43:06]

#

Jes! Kiitoksia loistavasta selostuksesta. Sain homman sitten toimimaan. Ohjelmaa on nyt paljon mukavampi koodailla eteenpäin. Tässä sitä näkee kun en niitä perusteita silloin joskus jaksanut tarpeeksi hyvin läpi lueskella ;)

Vastaus

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

Tietoa sivustosta