2016-11-21 58 views
-2

我有3类1)GameStateManager 2)MenuState(从称为游戏状态另一个类继承)3)游戏状态错误传递这个指针作为参数传递给类构造

欲这个指针作为参数传递到MenuState的构造。

我的目标是在MenuState中获取一个指向GameStateManager对象的指针,以备将来使用。

我得到错误:

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的前向声明,并从MenuStat.h中删除#include“GameStateManager.h”可以解决这个问题。 – drescherjm

+2

错误消息指的是复制构造函数。 “错误行”与复制构造函数上下文无关。你需要编辑你的问题并提供[mcve]。 –

+2

*** error 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(class GameStateManager&gsm)就可以解决问题。但是我想知道,是由于代码构造糟糕还是其他原因导致问题出现? – Sam

+0

通过使用类的交叉引用指针或引用是常见的,但是指针或引用需要名字类型而不是类型的定义。除非类型成员的访问,否则不需要包含标题。 – Kai