2016-11-21 55 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