Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Koodin jako tiedostoihin (C++)

Sivun loppuun

vehkis91 [24.10.2008 14:56:40]

#

Minulla on projektissani tällä hetkellä kolme tiedostoa: Player.hpp Player.cpp ja main.cpp. Nyt ongelmaksi muodostuu luokan jäsenfunktioiden kutsuminen mainista, sekä yhteiset globaalit muuttujat, jotka sijaitsevat Player.hpp:ssa, koska näitä tiedostoja tarvitaan sekä Player.cpp:ssä että mainissa.

Kopsaan tähän keskeneräisen Player.cpp:n

#ifndef _PLAYER_HPP
#define _PLAYER_HPP


#include <SDL.h>



typedef unsigned short int USHORT;

//Pelaajan kuvien maara
const int IMAGES            =12;

//Näytön ominaisuudet

#define SCREEN_WIDTH     (800)
#define SCREEN_HEIGHT    (600)
#define SCREEN_COLOR     (32)



//Surfacet, joille piirretään
    SDL_Surface *naytto; //KÄytetäänkö näiden kanssa externiä?
    SDL_Surface *tausta;




class player
{
public:

    void SetPosition(int& x, int& y)
	{
	    player::x = x;
        player::y = y;
    }

	//Palauttaa pelaajan x:n ja y:n
	int GetX(int& x)const {return player::x;}
	int GetY(int& y)const {return player::y;}

    void Move();


	//inline on nopeampi kuin normaali funktio
	//Piirrossa tarvitaan nopeutta.
	inline int Draw();

	void LoadImages();

    player  (const int& energy, const int& x,
             const int& y, const int& speed);

	~player();

//private:
	USHORT energy;	    //Energia
        USHORT speed;		// nopeus
	bool state;	        //Tila: Elävä, kuollut

	int x,y;		    //Sijainti

	SDL_Surface *Kuvat[IMAGES]; // Pelaajan 12 kuvaa

	Uint8* keyboard;   // "näppäimistön" osoite
};


#endif

Eli en voi lisätä projektiini yhtään mitään, ennen kuin saan tämän tiedostoon jaon toimimaan. Joten koodi todellakaan ei ole lopullisessa muodossaan.

Projektiin tulee vielä ainakin Viholliset.hpp ja Viholliset.cpp

Olisin kiitollinen jos kertoisitte miten toimia. :D

Edit: Kooditagit olivat vääri....

ville-v [24.10.2008 15:41:23]

#

Siirrä

SDL_Surface *naytto;
SDL_Surface *tausta;

tiedostoon player.cpp ja laita tiedostoon player.hpp ainoastaan

extern SDL_Surface *naytto;
extern SDL_Surface *tausta;

, muuten muuttujat eivät eri tiedostoissa viittaa samaan osoitteeseen.

Luokan jäsenfunktioita kutsutaan näin:

#include "player.hpp"

player pelaaja;

main(){
    int e = pelaaja.GetX();
}
#include "player.hpp"

extern player pelaaja;

funktio(){
    int a = pelaaja.GetY();
}

vehkis91 [24.10.2008 15:48:30]

#

Okei kiitos vastauksesta, pitää heti kokeilla. :D

Edit: Enään tämä errori jäljellä ja pari warningia...
F:/Programing/main.cpp:66: undefined reference to `player::Draw()'

Edit2: sain toimiin ku muutin inlinesta tavalliseksi funkkariksi, miten saisin toimimaan inline-funktiona? :O

Metabolix [24.10.2008 16:39:14]

#

Olet näköjään kommentoinut aiheesta kertovaa koodivinkkiäni. Vastasin sinne. Olet tehnyt virheitä sellaisissakin kohdissa, joita koodivinkkini esimerkissä esitetään. Katsopa sitä siis uudestaan ihan ajatuksella. Määrittelyt otsikkoon, toteutukset cpp:hen.

Tutustu käsitteeseen inline-funktio ja opettele ymmärtämään, missä kohti syntyy oikeasti binaariin asti päätyvää sisältöä. Sääntönä on, että jokainen asia (muuttujat ja funktiot) saavat päätyä binaariin vain kerran, joten esimerkiksi rivi int x; saa mennä kääntäjän läpi vain kerran, muilla kerroilla sen korvaa extern int x;, joka ei luo muuttujaa vaan kertoo vain, että sellainen on olemassa.

Voisi jopa sanoa, että koodin täytyy enimmäkseen toimia myös siinä tapauksessa, että liität kaikki cpp-tiedostot peräkkäin. Vertaa seuraavia:

// main.cpp
int x;
// pelaaja.cpp
int x; // VIRHE: esiintyi jo kerran!
extern int x; // Kas: x on olemassa
extern int x; // Sen saa kertoa uudestaankin
int x; // Tässä se sitten oikeasti on, löytyy siis lopullisesta ohjelmasta
extern int x; // Ei haittaa, vaikka kerrottaisiin vielä myöhemmin uudestaan

TsaTsaTsaa [24.10.2008 18:16:49]

#

#ifndef, #define ja #endif pois cpp-tiedostosta.

vehkis91 [24.10.2008 20:45:35]

#

Ei siellä sellaisia olekkaan... :S Tuo tiedosto on Player.hpp.

EDit: oho oli tullut kirjoitusvirhe, eli kyseinen koodi on Player.hpp-tiedostosta.

TsaTsaTsaa [24.10.2008 22:12:01]

#

vehkis91 kirjoitti:

Ei siellä sellaisia olekkaan... :S Tuo tiedosto on Player.hpp.

Oho katos vaan, olis pitänyt lukea itekin muutakin kun ekat rivit niin olis tullut tuo huomattua.

Metabolix [25.10.2008 14:17:32]

#

vehkis91, kirjoitin aiheesta vielä toisenkin koodivinkin, joka keskittyy juuri luokkiin ja muutenkin selkeämmin C++:aan.

ville-v, voisit harkita tyyppimääreen (int) käyttöä funktioiden edessä:

lainaus:

error: ISO C++ forbids declaration of ‘funktio’ with no type

vehkis91 [25.10.2008 14:51:55]

#

Oke. Pitää katsoa se. :D


Sivun alkuun

Vastaus

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

Tietoa sivustosta