2015-01-18 2 views
0

Я хочу создать «игровой движок»/диспетчер состояний для своей игры, и теперь у меня есть проблема с C++.C++ Класс внутри другого класса с указателем на первый класс

У меня есть классная играEngine.

class gameEngine 
{ 
public: 
    gameEngine(); 
    ~gameEngine(); 


// the stack of states 
    std::vector<gameState*> states; 
... 
}; 

У этого есть стек объектов gameState, когда он работает. Теперь моя проблема в том, что я хочу, чтобы в gameStates был указатель на gameEngine, так что состояния могут манипулировать им, изменять состояния и получать доступ к данным, которые нужны всем штатам.

Я думал, что могу просто иметь указатель в классе состояний и использовать construcktor, но это дает мне ошибку.

| 15 | error: 'gameEngine' не называет тип |

Это класс моих состояний.

class gameState 
{ 
public: 
    gameState(gameEngine* e); 
    ~gameState(); 

    gameEngine* engine;//Here is the error 

}; 

Является ли моя логика ложной, и это невозможно или как я могу ее реализовать?

Редактировать: Я попытался поставить класс gameEngine; перед моим игровым классом. Если я это сделаю, это даст мне кучу других ошибок. В целом класс gameEngine все игровые состояния теперь не объявлены компилятором.

| 16 | error: 'gameState' не был объявлен |

Везде, где я использую gameState внутри класса GameEngine.

Редактировать 2: У меня есть работа сейчас. Ответ на ответ с форвардной декларацией работал, и сначала у меня был неправильный порядок #include. Спасибо всем.

+0

Я предполагаю, что 'gameEngine' определяется ** после **' gameState'. Поэтому 'gameState' понятия не имеет, что такое' gameEngine'. Используйте форвардную декларацию. – Rotem

+0

Возможный дубликат [не называет ошибку типа в C++] (http://stackoverflow.com/questions/2133250/does-not-name-a-type-error-in-c) – paisanco

+0

_ "У которого есть стек объектов gameState, когда он работает "_ no it is not –

ответ

3

Перед использованием указателя в вашем классе gameState вам необходимо направить объявление gameEngine.

class gameEngine; // <-- forward declaration 
class gameState 
{ 
public: 
    gameState(gameEngine* e); 
    ~gameState(); 

    gameEngine* engine; 
}; 
+0

Спасибо, но я уже пробовал это. Если я это сделаю, это даст мне кучу других ошибок. В целом класс gameEngine все игровые состояния теперь не объявлены компилятором. | 16 | error: 'gameState' не был объявлен | Везде, где я использую gameState внутри класса GameEngine. – Neverwere

+0

Затем отправьте эти ошибки. Измените исходный вопрос с этими ошибками и тем, что вы пробовали. – CoryKramer

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