Estoy desarrollando con la última versión de Code::Blocks, liberada hace nada (la 10.05), y con la copia de MinGW que traía (sip, me interesa que lo que haga sea multiplataforma).
Bueno al lío, resulta que estoy teniendo un problema con Herencia que no consigo resolver. Hay que decir que, en lo que llevo estudiado de C++ hasta ahora en la "uni", todavía no hemos tocado herencia, pero dado que he tenido contacto con ella en Java y C#, pues, leyendo un poco por ahí y otro poco por allá... van saliendo las cosas.
En fin, el problema es el siguiente: Tengo una clase Entity, la cual es esta:
Código
#ifndef _ENTITY_H #define _ENTITY_H #include <iostream> #include <SDL_Image.h> class Entity{ protected: SDL_Rect canvas; SDL_Surface* graph; bool alive; int speed, acceleration; public: Entity(); Entity(SDL_Surface* graph, Sint16 x, Sint16 y, int speed, int acceleration, bool alive); void moveX(Sint16 amount); void moveY(Sint16 amount); SDL_Rect getCanvas(); SDL_Surface* getGraph(); int getSpeed(); int getAcceleration(); void setSpeed(int newSpeed); void setAcceleration(int newAcceleration); }; #endif
Código
#include "Entity.h" Entity::Entity(SDL_Surface* graph, Sint16 x, Sint16 y, int speed, int acceleration, bool alive){ this->graph = graph; canvas.x = x; canvas.y = y; canvas.h = this->graph->h; canvas.w = this->graph->w; this->speed = speed; this->acceleration = acceleration; this->alive = alive; } void Entity::moveX(Sint16 amount){ canvas.x += amount; } void Entity::moveY(Sint16 amount){ canvas.y += amount; } SDL_Rect Entity::getCanvas(){ return canvas; } SDL_Surface* Entity::getGraph(){ return graph; } int Entity::getSpeed(){ return speed; } int Entity::getAcceleration(){ return acceleration; } void Entity::setSpeed(int newSpeed){ speed = newSpeed; } void Entity::setAcceleration(int newAcceleration){ acceleration = newAcceleration; }
Y una clase Player:
Código
#ifndef PLAYER_H_INCLUDED #define PLAYER_H_INCLUDED #include "Entity.h" class Player: public Entity{ private: bool mouseEnabled; bool keyboardEnabled; bool joystickEnabled; bool keyStates[233]; public: Player(SDL_Surface* graph, Sint16 x, Sint16 y, int speed, int acceleration, bool alive); void enableControl(bool keyboard, bool mouse, bool joystick); void keyboardHandler(SDL_KeyboardEvent keyEv); }; #endif // PLAYER_H_INCLUDED
Código
#include "Player.h" Player::Player(SDL_Surface* graph, Sint16 x, Sint16 y, int speed, int acceleration, bool alive){ this->graph = graph; canvas.x = x; canvas.y = y; canvas.h = this->graph->h; canvas.w = this->graph->w; this->speed = speed; this->acceleration = acceleration; this->alive = alive; } void Player::enableControl(bool keyboard, bool mouse, bool joystick){ this->keyboardEnabled = keyboard; this->mouseEnabled = mouse; this->joystickEnabled = joystick; } void Player::keyboardHandler(SDL_KeyboardEvent keyEv){ if(keyEv.type == SDL_KEYDOWN){ keyStates[keyEv.keysym.sym] = true; }else if(keyEv.type == SDL_KEYUP){ keyStates[keyEv.keysym.sym] = false; } if(keyStates[SDLK_UP]){ moveY(-speed + acceleration); } if(keyStates[SDLK_RIGHT]){ moveX(speed + acceleration); } if(keyStates[SDLK_DOWN]){ moveY(speed + acceleration); } if(keyStates[SDLK_LEFT]){ moveX(-speed + acceleration); } }
(Perdonad el supertocho, pero la culpa es del foro por no tener una mala etiqueta Spoiler para "plegarlo" )
Bueno, como se puede ver, mi intención es que la clase Player herede de la clase Entity, añadiendo ciertas cosas que tienen sentido para un jugador, pero que no tienen porqué existir para entidad genérica (vease bicho, bonus, etc ...).
Esta es la parte del main donde creo el objeto:
Código
Player* toad = new Player(graphPool->getGraph(0), 100, 100, 10, 0, true);
(Lo de "toad" es simplemente porque... porque me ha dado la gana de hacer las pruebas de superficie con el personajillo del mario XD)
En fin, me pongo a compilar el "invento", y el Code::Blocks me dice que nanai:
Cita de: CodeBlocks
||=== SDLGameTests, Debug ===|
M:\Documentos\Programacion\Proyectos\C++\SDLGameTests\main.cpp||In function 'int main(int, char**)':|
M:\Documentos\Programacion\Proyectos\C++\SDLGameTests\main.cpp|57|warning: taking address of temporary|
obj\Debug\Player.o||In function `Player':|
M:\Documentos\Programacion\Proyectos\C++\SDLGameTests\Player.cpp|3|undefined reference to `Entity::Entity()'|
M:\Documentos\Programacion\Proyectos\C++\SDLGameTests\Player.cpp|3|undefined reference to `Entity::Entity()'|
||=== Build finished: 2 errors, 1 warnings ===|
M:\Documentos\Programacion\Proyectos\C++\SDLGameTests\main.cpp||In function 'int main(int, char**)':|
M:\Documentos\Programacion\Proyectos\C++\SDLGameTests\main.cpp|57|warning: taking address of temporary|
obj\Debug\Player.o||In function `Player':|
M:\Documentos\Programacion\Proyectos\C++\SDLGameTests\Player.cpp|3|undefined reference to `Entity::Entity()'|
M:\Documentos\Programacion\Proyectos\C++\SDLGameTests\Player.cpp|3|undefined reference to `Entity::Entity()'|
||=== Build finished: 2 errors, 1 warnings ===|
Los errores de la discordia son los ennegrecidos. Es decir, se ubican en la tercera línea del Player.cpp, justo donde comienza el constructor de la clase.
Llevo no se el tiempo ya tratando de intuir qué demonios me está queriendo decir el compilador con lo de "referencia sin definir" ...
¿Alguna idea? .
Salu2
P.D: Se me ha ocurrido hacer un cambio, eliminar el Entity(); del Entity.h:
Código
public: Entity(); Entity(SDL_Surface* graph, Sint16 x, Sint16 y, int speed, int acceleration, bool alive);
Y el error que da ahora la compilación es este:
Cita de: CodeBlocks
M:\Documentos\Programacion\Proyectos\C++\SDLGameTests\Player.cpp||In constructor 'Player::Player(SDL_Surface*, Sint16, Sint16, int, int, bool)':|
M:\Documentos\Programacion\Proyectos\C++\SDLGameTests\Player.cpp|3|error: no matching function for call to 'Entity::Entity()'|
M:\Documentos\Programacion\Proyectos\C++\SDLGameTests\Entity.h|15|note: candidates are: Entity::Entity(SDL_Surface*, Sint16, Sint16, int, int, bool)|
M:\Documentos\Programacion\Proyectos\C++\SDLGameTests\Entity.h|7|note: Entity::Entity(const Entity&)|
||=== Build finished: 1 errors, 0 warnings ===|
M:\Documentos\Programacion\Proyectos\C++\SDLGameTests\Player.cpp|3|error: no matching function for call to 'Entity::Entity()'|
M:\Documentos\Programacion\Proyectos\C++\SDLGameTests\Entity.h|15|note: candidates are: Entity::Entity(SDL_Surface*, Sint16, Sint16, int, int, bool)|
M:\Documentos\Programacion\Proyectos\C++\SDLGameTests\Entity.h|7|note: Entity::Entity(const Entity&)|
||=== Build finished: 1 errors, 0 warnings ===|