siDDis Skrevet 19. august 2006 Del Skrevet 19. august 2006 Eg held på å lage eit lite spel. Eg har laga eit objekt som eg skal hente posisjon på x og y akse frå. I klassen Character.h så har eg deklarert det sånn. class Character { // Methods public: ~Character(); // This must be called each frame void update(float deltaTime); void draw(); float getPositionX(); float getPositionY(); private: float m_x; float m_y; } Når eg kjører ein build i Anjuta så funker det fint. (Kva er build forresten? Det er ikkje det same som å kompilere vell?) Men når eg legger til metodene i Character.cpp float Character::getPositionX() { return m_x; } float Character::getPositionY() { return m_y; } Så får eg feilmelding når eg kjører ein build Character.cpp:74: error: no ‘float Character::getPositionX()’ member function declared in class ‘Character’ Character.cpp:79: error: no ‘float Character::getPositionY()’ member function declared in class ‘Character’ Kva er det eg ikkje forstår? Lenke til kommentar
................... Skrevet 19. august 2006 Del Skrevet 19. august 2006 (endret) ... Endret 9. juli 2010 av ................... Lenke til kommentar
_vamecum Skrevet 19. august 2006 Del Skrevet 19. august 2006 Eg held på å lage eit lite spel. Eg har laga eit objekt som eg skal hente posisjon på x og y akse frå. I klassen Character.h så har eg deklarert det sånn. class Character { // Methods public: ~Character(); // This must be called each frame void update(float deltaTime); void draw(); float getPositionX(); float getPositionY(); private: float m_x; float m_y; } Når eg kjører ein build i Anjuta så funker det fint. (Kva er build forresten? Det er ikkje det same som å kompilere vell?) Men når eg legger til metodene i Character.cpp float Character::getPositionX() { return m_x; } float Character::getPositionY() { return m_y; } Så får eg feilmelding når eg kjører ein build Character.cpp:74: error: no ‘float Character::getPositionX()’ member function declared in class ‘Character’ Character.cpp:79: error: no ‘float Character::getPositionY()’ member function declared in class ‘Character’ Kva er det eg ikkje forstår? 6706956[/snapback] Hvorfor bruker du ikke en vektor-struct eller noe slikt? Og holde posisjonen i to variabler er ganske teit egentlig struct Point { float x; float y; }; Uansett. Har du inkludert header-filen i cpp-filen? og forresten, du burde ha includer-guards i h fila. dvs.. noe sånt som #ifndef H_xxHEADERFILNAVNxx_H #define H_xxHEADERFILNAVNxx_H //kode #endif Dette er for å unngå linker errors. lykke til! Lenke til kommentar
Dead_Rabbit Skrevet 19. august 2006 Del Skrevet 19. august 2006 Kan jeg se hele koden? Virker som at det er noe kluss når du inkluderer headerfilen i kildefilen, ettersom at kompilatoren klager på at funksjonene du implementerer ikke er deklarert. Og forøvrig så er "build" det samme som å kompilere og linke. Dvs. at man kompilerer hver enkelt fil til en objektfil, for deretter at disse linkes sammen til den kjørbare fila. Lenke til kommentar
siDDis Skrevet 19. august 2006 Forfatter Del Skrevet 19. august 2006 Nå fant eg feilen, eg lagra til feil Header fil som blei kjørt i builden Typisk tabbefeil. Når det gjelder brukt av strukturer så er jo koordinatene allereie lagra i eit objekt, men eg trenger ikkje å returnere alle verdiane i objektet? Eg poster begge dei 2 filene her. // Character.h #ifndef CHARACTER_H #define CHARACTER_H #include "SDL/SDL.h" #include "SDLGraphics.h" class Character { // Methods public: // This class holds a pointer to the graphics object but will not destroy it. Character(SDLGraphics* graphics, int imageX, int imageY, int width, int height, int transparentR, int transparentG, int transparentB, const char* bitmapFileName, float x, float y, float maxSpeed); ~Character(); // This must be called each frame void update(float deltaTime); void draw(); void moveLeft(); void moveRight(); void moveUp(); void moveDown(); void stopMoving(); float getPositionX(); float getPositionY(); // Data private: SDLGraphics* m_graphics; SDL_Surface* m_bitmap; float m_x; float m_y; float m_width; float m_height; float m_imageX; float m_imageY; float m_maxSpeed; float m_currentSpeedX; float m_currentSpeedY; }; #endif // Character.cpp #include "Character.h" Character::Character(SDLGraphics* graphics, int imageX, int imageY, int width, int height, int transparentR, int transparentG, int transparentB, const char* bitmapFileName, float x, float y, float maxSpeed) : m_graphics(graphics), m_imageX(imageX), m_imageY(imageY), m_width(width), m_height(height), m_x(x), m_y(y), m_maxSpeed(maxSpeed), m_currentSpeedX(0.0f) { m_bitmap = m_graphics->loadBitmap(bitmapFileName, transparentR, transparentG, transparentB); } Character::~Character() { m_graphics->closeBitmap(m_bitmap); } // Updates the Objects position on screen. void Character::update(float deltaTime) { m_x += m_currentSpeedX * deltaTime; m_y += m_currentSpeedY * deltaTime; // We dont want the objects to go outside the screen. if (m_x < 0.0f) m_x = 0.0f; if (m_x > 960.0f) m_x = 960.0f; if (m_y < 0.0f) m_y = 0.0f; if (m_y > 704.0f) m_y = 704.0f; } void Character::draw() { m_graphics->drawSprite(m_bitmap, m_imageX, m_imageY, m_x, m_y, m_width, m_height); } void Character::moveLeft() { m_currentSpeedX = -m_maxSpeed; } void Character::moveRight() { m_currentSpeedX = m_maxSpeed; } void Character::moveUp() { m_currentSpeedY = -m_maxSpeed; } void Character::moveDown() { m_currentSpeedY = m_maxSpeed; } void Character::stopMoving() { m_currentSpeedX = 0.0f; m_currentSpeedY = 0.0f; } float Character::getPositionX() { return m_x; } float Character::getPositionY() { return m_y; } Bør eg verkeleg lage ein strukt i den klassen som skiller ut koordinatene? Eg er ganske fersk i OOP og trenger trening her. Dette putter eg inn i Header fila ikkje sant? struct Position { float x; float y; }; Lenke til kommentar
................... Skrevet 19. august 2006 Del Skrevet 19. august 2006 (endret) ... Endret 9. juli 2010 av ................... Lenke til kommentar
Dead_Rabbit Skrevet 20. august 2006 Del Skrevet 20. august 2006 Alle deklarasjoner, enten det er klassedeklarasjoner, funksjonsdeklarasjoner, eller hva det måtte være av deklarasjoner, så går dette i headerfiler. Alt av definisjoner, går imidlertid i kildefiler. Dessuten så er det ikke dumt å bruke .hpp istedenfor .h som filendelse i headerfiler når det er snakk om C++, på samme måte som at man bruker .cpp istedenfor .c i kildefiler. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå