I'm working on a target shooting game where every target contains 2 leds and a piezo sensor (to register hits and it worked perfectly). This game will have multiple game modes based on the gamemode class (object) selected (each of them are children of a Gamemode cabstract clas with virtual functions that are overridden in the subclass definitions.
When i compile the code. I get this error which indicates that i'm trying to use undefines virtual methods.
C:\Users\PC\AppData\Local\Temp\ccEx1BKF.ltrans0.ltrans.o: In function `Gamemode::Gamemode()':
C:\Users\PC\Desktop\sketch_jan18a/Gamemode.h:12: undefined reference to `vtable for Gamemode'
C:\Users\PC\Desktop\sketch_jan18a/Gamemode.h:12: undefined reference to `vtable for Gamemode'
C:\Users\PC\AppData\Local\Temp\ccEx1BKF.ltrans0.ltrans.o: In function `global constructors keyed to 65535_0_GameHandler.cpp.o.2003':
<artificial>:(.text.startup+0x132): undefined reference to `vtable for Gamemode'
<artificial>:(.text.startup+0x134): undefined reference to `vtable for Gamemode'
C:\Users\PC\AppData\Local\Temp\ccEx1BKF.ltrans0.ltrans.o: In function `handleTargetsLogic':
C:\Users\PC\Desktop\sketch_jan18a/GameHandler.cpp:39: undefined reference to `Gamemode::prepareTargetHandler(Target&)'
C:\Users\PC\Desktop\sketch_jan18a/GameHandler.cpp:41: undefined reference to `Gamemode::onTargetHitHandler(Target&)'
collect2.exe: error: ld returned 1 exit status
exit status 1
Compilation error: exit status 1
Following snippets are the Gamemode header file:
#ifndef GAMEMODE_H
#define GAMEMODE_H
#include <stdlib.h>
#include <Arduino.h>
#include "Target.h"
#include "TargetState.h"
// enum Gamemode { SOLO_TIME_CHALLENGE,
// SOLO_RANDOM_CHALLENGE,
// MULTI_RANDOM_CHALLENGE };
class Gamemode {
protected:
unsigned long startTime;
unsigned long endTime;
int ledOneThreshold;
int ledTwoThreshold;
int ledAllThreshold;
int ledNonThreshold;
public:
virtual void handleGameModeLogic();
virtual void onTargetHitHandler(Target &target);
virtual void prepareTargetHandler(Target &target);
};
#endif
subclass (Solotimemode.h and Solotimemode.cpp) files:
#ifndef SOLOTIMEMODE_H
#define SOLOTIMEMODE_H
#include <stdlib.h>
#include <Arduino.h>
#include "Gamemode.h"
#include "Target.h"
class SoloTimeMode : public Gamemode {
private:
int _score;
int _numTargets;
public:
SoloTimeMode(int numTargets);
void handleGameModeLogic() override;
void prepareTargetHandler(Target &target) override;
void onTargetHitHandler(Target &target) override;
void endGame();
};
#endif
#include <stdlib.h>
#include <Arduino.h>
#include "SoloTimeMode.h"
SoloTimeMode::SoloTimeMode(int numTargets) {
_score = 0;
startTime = millis();
endTime = 0;
_numTargets = numTargets;
ledOneThreshold = 0;
ledTwoThreshold = 0;
ledAllThreshold = 0;
ledNonThreshold = 0;
}
void SoloTimeMode::handleGameModeLogic() {
}
void SoloTimeMode::prepareTargetHandler(Target &target) {
switch (target.getState()) {
case LED_NON:
target.setState(LED_ONE);
break;
case LED_TWO:
break;
case LED_ONE:
break;
case LED_ALL:
break;
}
}
void SoloTimeMode::onTargetHitHandler(Target &target) {
switch (target.getState()) {
case LED_NON:
// do nothing
break;
case LED_TWO:
break;
case LED_ONE:
// _score++;
target.setState(LED_TWO);
_score++;
if (_score == _numTargets) { endGame(); }
break;
case LED_ALL:
break;
}
}
void SoloTimeMode::endGame() {
endTime = millis();
}
and finally, the gamehandler.cpp file which will be the class that uses the gamemode:
#include "GameHandler.h"
#include <stdlib.h>
#include <Arduino.h>
GameHandler::GameHandler(Target targets[], int numTargets, Gamemode mode) {
_targets = targets;
_numTargets = numTargets;
_isPaused = true;
_gameEnded = false;
_gamemode = mode;
_gameTimer = 0;
}
void GameHandler::init() {
for (int i = 0; i < _numTargets; i++) {
_targets[i].init();
}
}
void GameHandler::selectGamemode(Gamemode mode) {
_gamemode = mode;
_isPaused = false;
_gameTimer = millis();
}
void GameHandler::gameLoop() {
if (_isPaused) {
return;
}
handleTargetsLogic();
}
void GameHandler::handleTargetsLogic() {
for (int i = 0; i < _numTargets; i++) {
_gamemode.prepareTargetHandler(_targets[i]);
if (_targets[i].hasBeenShot()) {
_gamemode.onTargetHitHandler(_targets[i]);
}
}
}
Keep in mind that I'm not really used to c++ imports and i'm not really sure if im doing class abstraction correctly here.
This is the file. You can see the error when you try to compile it for an arduino uno