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....
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(); }
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
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
#ifndef, #define ja #endif pois cpp-tiedostosta.
Ei siellä sellaisia olekkaan... :S Tuo tiedosto on Player.hpp.
EDit: oho oli tullut kirjoitusvirhe, eli kyseinen koodi on Player.hpp-tiedostosta.
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.
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
Oke. Pitää katsoa se. :D
Aihe on jo aika vanha, joten et voi enää vastata siihen.