substance-r2d2
substance-r2d2

Reputation: 13

unable to initialize Static const string

I have a class "GameOverState" which has a private member

static const std::string s_gameOverID;

In GameOverState.cpp I am initialising as :

const std::string GameOverState::s_gameOverID = "GAMEOVER";

I am getting the following errors:

error C4430: missing type specifier - int assumed. Note: C++ does not support default-int   
error C2440: 'initializing' : cannot convert from 'const char [9]' to 'int' 
error C2377: 'std::string' : redefinition; typedef cannot be overloaded with any other symbol
error C2373: 's_gameOverID' : redefinition; different type modifiers    
error C2143: syntax error : missing ';' before 'GameOverState::s_gameOverID'

I have a PlayState class/PauseState class which have the same implementation which are working fine. How do I fix this bug??

GameOverState.h

#pragma once

#include "GameState.h"
#include "PlayState.h"
#include "MenuState.h"
#include "PauseState.h"
#include "AnimatedGraphic.h"
#include <string>


class GameObject;

class GameOverState : public GameState
{
public:
  virtual void update();
  virtual void render();
  virtual bool onEnter();
  virtual bool onExit();
  virtual std::string getStateID() const { return s_gameOverID; }
private:
  static void s_gameOverToMain();
  static void s_restartPlay();
  static const std::string s_gameOverID;
  std::vector<GameObject*> m_gameObjects;
}

GameOverState.cpp #include "GameOverState.h"

const std::string GameOverState::s_gameOverID = "GAMEOVER";

void GameOverState::s_gameOverToMain()
{
  TheGame::Instance()->getStateMachine()->changeState(new MenuState());
}

void GameOverState::s_restartPlay()
{
  TheGame::Instance()->getStateMachine()->changeState(new PlayState());
}

bool GameOverState::onEnter()
{
  if (!TheTextureManager::Instance()->load("assets/gameover.png", "gameovertext", TheGame::Instance()->getRenderer()))
  {
    return false;
  }
  if (!TheTextureManager::Instance()->load("assets/main.png", "mainbutton", TheGame::Instance()->getRenderer()))
  {
    return false;
  }
  if (!TheTextureManager::Instance()->load("assets/restart.png", "restartbutton", TheGame::Instance()->getRenderer()))
  {
    return false;
  }
  GameObject* gameOverText = new AnimatedGraphic(new LoaderParams(200, 100, 190, 30, "gameovertext"), 2);
  GameObject* button1 = new MenuButton(new LoaderParams(200, 200, 200, 80, "mainbutton"), s_gameOverToMain);
  GameObject* button2 = new MenuButton(new LoaderParams(200, 300, 200, 80, "restartbutton"), s_restartPlay);
  m_gameObjects.push_back(gameOverText);
  m_gameObjects.push_back(button1);
  m_gameObjects.push_back(button2);
  std::cout << "entering PauseState\n";
  return true;
}

Upvotes: 0

Views: 644

Answers (2)

jrok
jrok

Reputation: 55425

You're missing the semicolon after the definition of GameOverState.

The preprocessor runs before compilation and basically just copy pastes the content of the header in the source file, altough we can't see that. An error resulting from a broken header can thus be pretty misleading.

It's legal to have class definitions inside a variable definition and the position of specifiers (like static) is not limited to the beginning of a declaration, either (for example, int const static x = 0; is fine).

So, your code looks like this to the compiler:

class GameOverState {} static const std::string GameOverState::s_gameOverID = "GAMEOVER";

Hopefully the errors make more sense now.

Upvotes: 1

WearyWanderer
WearyWanderer

Reputation: 181

As everyone else has said, you're probably missing the #include line in your header if your other two classes are working fine. It's presuming and expecting an int, so that seems the case.

Make sure #include<string> is in your header

Upvotes: 0

Related Questions