2010-05-26 2 views
2

Код Game.h:Visual C++: Ошибка компилятора C4430

#ifndef GAME_H 
#define GAME_H 

class Game 
{ 
    public: 
     const static string QUIT_GAME; // line 8 
     virtual void playGame() = 0; 
}; 

#endif 

Ошибка:

game.h(8): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
game.h(8): error C2146: syntax error : missing ';' before identifier 'QUIT_GAME' 
game.h(8): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 

Что я делаю неправильно?

ответ

6

Вот что вам нужно исправить ваши вопросы:

1. Включите файл заголовка строки:
#include <string>

2 . Префикс string с его пространством: const static std::string QUIT_GAME;

или вставить using заявление:

#include <string> 
using std::string; 

3. Распределение пространства для переменной
Так как вы объявили его в качестве static в классе, он должен быть определен где-то в коде:
const std::string Game::QUIT_GAME;

4. Инициализировать переменную значением Поскольку вы объявили строку с const, вы должны инициализировать его значение (или она будет оставаться постоянной пустой строкой) .:
const std::string Game::QUIT_GAME = "Do you want to quit?\n";

+4

Не используйте 'use' в файлах заголовков. Очень плохой juju.В противном случае, отличный, исчерпывающий ответ. –

4
#include <string> 
... 
const static std::string QUIT_GAME; 
+6

Вы никогда не должны ставить 'using' заявление в файле заголовка , Он необратимо загрязняет пространство имен любого файла, который включает. –

+0

@Adam: fixed ~~~ –

8

Вы должны сделать две вещи:

  • #include <string>
  • Изменение типа в const static std::string QUIT_GAME (добавление std::)
+1

На самом деле еще одно: инициализировать переменную. Спецификатор 'const' - это кикер. Если переменная не инициализирована, она будет пустой пустой строкой. У этого есть использование, но я не думаю, что это то, чего хотел OP. –

+2

Обратите внимание, что вы не можете инициализировать строку (даже постоянную статическую строку) внутри объявления класса. В соответствующем файле источника (.cpp) должен быть отдельный оператор определения (формы 'const std :: string Game :: QUIT_GAME =" Whatever ";'). Изменить: просто посмотрел ваш ответ, который объясняет это подробно ниже, и поддержал его. –

0

попробуйте добавить в верхней части:

#include <string> 
using std::string; 
+0

В заголовке ??? Кто это проголосовал? – sbi

Смежные вопросы