2016-11-21 2 views
-2

У меня есть 3 класса 1) GameStateManager 2) MenuState (наследуется от другого класса под названием GameState) 3) GameStateОшибка Проходя этот указатель в качестве аргумента в конструктор класса

я хочу передать этот указатель в качестве аргумента конструктора MenuState в.

Моя цель - получить указатель на объект GameStateManager в MenuState для будущего использования.

Я получаю ошибки:

error C2061: syntax error: identifier 'GameStateManager' 
error C2664: 'MenuState::MenuState(const MenuState &)': cannot convert argument 1 from 'GameStateManager' to 'const MenuState &' 
note: Reason: cannot convert from 'GameStateManager' to 'const MenuState' 

GameStateManager.h

#pragma once 

#include <vector> 
#include <SFML/Graphics.hpp> 
#include "MenuState.h" 

class GameStateManager { 
public: 
    static const int MENUSTATE = 0; 
    static const int FIRSTLEVELSTATE = 1; 

    GameStateManager(); 

    ~GameStateManager(); 
private: 
    std::vector<GameState*> States; 
    int currentState; 
}; 

GameStateManager.cpp

GameStateManager::GameStateManager() { 
    this->currentState = MENUSTATE; 
    this->States.push_back(new MenuState(*this)); // Error Line. I Think! 
} 

MenuState.h

#pragma once 
#include "GameState.h" 
#include "GameStateManager.h" 
class MenuState: public GameState{ 
public: 
    MenuState(GameStateManager& gsm); 
    ~MenuState(); 
}; 

MenuState.cpp

MenuState::MenuState(GameStateManager& gsm){ // Error Line. I Think! 
} 

GameState.h

#pragma once 
#include <SFML/Graphics.hpp> 
class GameState { 
//Virtual methods are here in this code which are not important for this question 
public: 
    GameState() {} 
    ~GameState() {} 
}; 

main.cpp

#include <SFML/Graphics.hpp> 
#include "GameStateManager.h" 

int main(int argc, char** argv) { 
    GameStateManager gsm; 
} 
+0

У вас есть циклическая зависимость от пути. Нужно ли 'MenuState.h' действительно включать GameStateManager.h? Я имею в виду передовое объявление GameStateManager и удаление #include «GameStateManager.h» из MenuStat.h, это можно исправить. – drescherjm

+2

Сообщение об ошибке относится к конструктору копирования. «Строка ошибок» не имеет никакого отношения к контексту конструктора копирования. Вам нужно отредактировать свой вопрос и предоставить [mcve]. –

+2

*** ошибка C2664: 'MenuState :: MenuState (const MenuState &)': не может преобразовать аргумент 1 из 'GameStateManager' в 'const MenuState &' *** Эта ошибка вызвана кодом, который не представлен. – drescherjm

ответ

1

Так как включение заголовка конфликт в GameStateManager.h и MenuState.h

Используйте прямую декларацию, если они объявлены как указатели или ссылки:

  1. MenuState::MenuState(class GameStateManager& gsm);
  2. std::vector<class MenuState*> States;

Затем положить линию #include "GameStateManager.h" в MenuState.cpp и положите линию #include "MenuState.h" в GameStateManager.h уменьшит погрешность.

+0

Просто добавление MenuState :: MenuState (класс GameStateManager & gsm) устранило проблему. Но мне было интересно, была ли проблема поднята из-за плохой структурированности кода или это что-то еще? – Sam

+0

Перекрестная ссылка классов с использованием указатель или ссылка распространены. Однако указателю или ссылке требуется имя тип, а не определение типа. Не нужно включать заголовок, если только доступ к элементу этого типа. – Kai

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