"classname" does not name a type

Hello,

I've been battling this issue since the past day and i do not know what to do.

I am new to arduino and c++. I'm working on an arduino airsoft target shooting game where every target contains 2 colors and a piezo sensor (to register hits and it worked perfectly). This game will have multiple game modes based on an enum selected.

This is the main arduino code:

#include "Target.h"
#include "GameHandler.h"

const int LED_PIN_1 = 7;
const int LED_PIN_2 = 6;
const uint8_t PIEZO_PIN_1 = A5;

const int LED_PIN_1a = 4;
const int LED_PIN_2a = 5;
const uint8_t PIEZO_PIN_2 = A0;


int counter = 0;

int targetSensitivity = 1000;



const int NUM_TARGETS = 2;
Target targets[NUM_TARGETS] = { Target(PIEZO_PIN_1, LED_PIN_1, LED_PIN_2),
                                Target(PIEZO_PIN_2, LED_PIN_1a, LED_PIN_2a) };

GameHandler gameHandler(targets, NUM_TARGETS);

void setup() {
  gameHandler.init();
  Serial.begin(9600);
  gameHandler.selectGamemode(SOLO_TIME_CHALLENGE);
}

void loop() {
  gameHandler.gameLoop();
}

This is my header target file

#ifndef TARGET_H
#define TARGET_H
#include <stdlib.h>
#include <Arduino.h>
#include "GameHandler.h"


enum TargetState { LED_NON,
                   LED_ONE,
                   LED_TWO,
                   LED_ALL };

class Target {
private:
  uint8_t _piezoPin;
  int _ledPin1;
  int _ledPin2;

  int _sensorValue;
  TargetState _state;

  unsigned long _timeSinceLedTwo;
  unsigned long _timeSinceLedOne;
  unsigned long _timeSinceLedNon;
  unsigned long _timeSinceLedAll;



public:

  int _ledOneThreshold;
  int _ledTwoThreshold;
  int _ledAllThreshold;
  int _ledNonThreshold;



  Target(uint8_t piezoPin, int ledPin1, int ledPin2);
  void init();

  int getSensorValue();

  TargetState getState();

  void setState(TargetState state);


  void prepareTarget(Gamemode gamemode);
  bool hasBeenShot();
};

#endif

this is my target cpp file

#include <stdlib.h>
#include <Arduino.h>
#include "Target.h"
#include "GameHandler.h"


Target::Target(uint8_t piezoPin, int ledPin1, int ledPin2) {

  _piezoPin = piezoPin;
  _ledPin1 = ledPin1;
  _ledPin2 = ledPin2;

  _timeSinceLedAll = 0;
  _timeSinceLedOne = 0;
  _timeSinceLedTwo = 0;
  _timeSinceLedNon = 0;

  _ledOneThreshold = 3000;
  _ledTwoThreshold = 3000;
  _ledAllThreshold = 3000;
  _ledNonThreshold = 1500;

  init();
}

void Target::init() {

  pinMode(_ledPin1, OUTPUT);
  pinMode(_ledPin2, OUTPUT);
  setState(LED_NON);
}


int Target::getSensorValue() {
  return _sensorValue;
}

TargetState Target::getState() {
  return _state;
}


// ONE = HIT
// TWO = READY
// NON = INACTIVE


void Target::setState(TargetState state) {
  _state = state;
  switch (state) {
    case LED_NON:
      digitalWrite(_ledPin1, LOW);
      digitalWrite(_ledPin2, LOW);
      _timeSinceLedNon = millis();
      break;
    case LED_TWO:
      digitalWrite(_ledPin1, LOW);
      digitalWrite(_ledPin2, HIGH);
      _timeSinceLedTwo = millis();
      break;
    case LED_ONE:
      digitalWrite(_ledPin1, HIGH);
      digitalWrite(_ledPin2, LOW);
      _timeSinceLedOne = millis();
      break;
    case LED_ALL:
      digitalWrite(_ledPin1, HIGH);
      digitalWrite(_ledPin2, HIGH);
      _timeSinceLedAll = millis();
      break;
  }
}

void Target::prepareTarget(Gamemode gamemode) {
  switch (gamemode) {
    case SOLO_TIME_CHALLENGE:
      switch (_state) {
        case LED_NON:
          if (millis() - _timeSinceLedNon >= _ledNonThreshold) {
            setState(LED_TWO);
          }

          break;
        case LED_TWO:
          if (millis() - _timeSinceLedTwo >= _ledTwoThreshold) {
            // DEACTIVATE TARGET AFTER SOME TIME
            setState(LED_NON);
          }
          break;
        case LED_ONE:
          if (millis() - _timeSinceLedOne >= 5000, true) {
            setState(LED_NON);
          }
          break;
        case LED_ALL:

          break;
      }
      break;
    default:
      break;
  }
}


bool Target::hasBeenShot() {
  _sensorValue = analogRead(_piezoPin);

  // if (_state != LED_TWO) { return false; }
  if (_sensorValue > 900) {
    return true;
  }
  return false;
}

These are my game handler cpp and header file. They manage the game loop. They are incomplete but im unable to continue due to the error im getting.

#ifndef GAMEHANDLER_H
#define GAMEHANDLER_H
#include <stdlib.h>
#include <Arduino.h>
#include "Target.h"

enum Gamemode { SOLO_TIME_CHALLENGE };


class GameHandler {
private:
  bool _isPaused;
  int _score;
  unsigned long _gameTimer;
  Gamemode _gamemode;
  int _numTargets;
  Target* _targets;
  unsigned long _gameDuration;

public:
  GameHandler(Target targets[], int numTargets);
  void init();
  void selectGamemode(Gamemode mode);
  void gameLoop();
  void handleSoloTimeChallenge();
  void targetOnhit1(Target target);
};


#endif

header file

#include "GameHandler.h"
#include "Target.h"
#include <stdlib.h>
#include <Arduino.h>

GameHandler::GameHandler(Target targets[], int numTargets) {
  _targets = targets;
  _numTargets = numTargets;
  _isPaused = true;
  _score = 0;
  _gameTimer = 0;
  _gameDuration = 10000000;
}

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;
  }

  switch (_gamemode) {
    case SOLO_TIME_CHALLENGE:
      handleSoloTimeChallenge();
      break;
    default:
      break;
  }
}

void GameHandler::handleSoloTimeChallenge() {
  for (int i = 0; i < _numTargets; i++) {
     _targets[i].prepareTarget(SOLO_TIME_CHALLENGE);
    if (_targets[i].hasBeenShot()) {
      targetOnhit1(_targets[i]);
    }
  }

  if (millis() - _gameTimer >= _gameDuration) {
    _isPaused = true;
    // end game logic
  }
}

void GameHandler::targetOnhit1(Target target) {
  switch (target.getState()) {
    case LED_NON:
      // do nothing
      break;
    case LED_TWO:
      _score++;
      target.setState(LED_ONE);
      break;
    case LED_ONE:
      break;
    case LED_ALL:
      break;
  }
}

I keep getting this error eveyrtime i validate.

In file included from C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:5:0,
                 from C:\Users\PC\Desktop\sketch_jan18a\GameHandler.cpp:1:
C:\Users\PC\Desktop\sketch_jan18a\Target.h:48:22: error: 'Gamemode' has not been declared
   void prepareTarget(Gamemode gamemode);
                      ^~~~~~~~
In file included from C:\Users\PC\Desktop\sketch_jan18a\Target.h:5:0,
                 from C:\Users\PC\Desktop\sketch_jan18a\sketch_jan18a.ino:1:
C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:17:3: error: 'Target' does not name a type
   Target* _targets;
   ^~~~~~
C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:21:22: error: expected ')' before 'targets'
   GameHandler(Target targets[], int numTargets);
                      ^~~~~~~
C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:26:21: error: 'Target' has not been declared
   void targetOnhit1(Target target);
                     ^~~~~~
C:\Users\PC\Desktop\sketch_jan18a\sketch_jan18a.ino:23:45: error: no matching function for call to 'GameHandler::GameHandler(Target [2], const int&)'
 GameHandler gameHandler(targets, NUM_TARGETS);
                                             ^
In file included from C:\Users\PC\Desktop\sketch_jan18a\Target.h:5:0,
                 from C:\Users\PC\Desktop\sketch_jan18a\sketch_jan18a.ino:1:
C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:10:7: note: candidate: GameHandler::GameHandler()
 class GameHandler {
       ^~~~~~~~~~~
C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:10:7: note:   candidate expects 0 arguments, 2 provided
C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:10:7: note: candidate: constexpr GameHandler::GameHandler(const GameHandler&)
C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:10:7: note:   candidate expects 1 argument, 2 provided
C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:10:7: note: candidate: constexpr GameHandler::GameHandler(GameHandler&&)
C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:10:7: note:   candidate expects 1 argument, 2 provided
In file included from C:\Users\PC\Desktop\sketch_jan18a\Target.h:5:0,
                 from C:\Users\PC\Desktop\sketch_jan18a\Target.cpp:3:
C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:17:3: error: 'Target' does not name a type
   Target* _targets;
   ^~~~~~
C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:21:22: error: expected ')' before 'targets'
   GameHandler(Target targets[], int numTargets);
                      ^~~~~~~
C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:26:21: error: 'Target' has not been declared
   void targetOnhit1(Target target);
                     ^~~~~~

exit status 1

Compilation error: 'Gamemode' has not been declared

Your Gamehandler.h includes Target.h and viceversa.

You should separate declaration and definition of your classes in separate files - put the declaration to the header and definitions to the .cpp.
Than you can include headers in any files that need them

All the headers are seperate files and all the cpp files are seperate. I need to include the target.h and gamehandler.h in each other because they are dependant on each other.

Sorry, I did see your code carefully

I understand what you mean. I double checked my code and all definitions are in the .cppp files. The header files only contain decllerations. I've uploaded the files here so you can have a better look. maybe i worded it incorrectly.

Try compiling it for an arduino uno. You'll get the same error. I'm 99% sure the main sketch code is working fine but it has something to do with the gamemode parameter in the prepareTarget method on the target.

Code might be a bit messy but that's because i did'nt wanna over engineer it way too much since i'm trying to finish the project as fast as i can.

Sorry, but wetransfer is unavailable in my country

Here it is on google drive. sketch_jan18a.zip - Google Drive

Finally it compiled

Move enums to separate file Gamemode.h:

#ifndef GAMEMODE_H
#define GAMEMODE_H

enum Gamemode { SOLO_TIME_CHALLENGE };

enum TargetState { LED_NON,
                   LED_ONE,
                   LED_TWO,
                   LED_ALL };
#endif

Include GameMode.h to Target.h and GameHandler.h

And do not include GameHandler.h in Target.h