Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 状态机,与#有关的问题包括_C++ - Fatal编程技术网

C++ 状态机,与#有关的问题包括

C++ 状态机,与#有关的问题包括,c++,C++,嘿,我试图为我的游戏实现状态机,我想测试一些东西。 所以现在我的机器有两个状态暂停和菜单,每一个都打印一个纹理,如果我按下鼠标,它应该会变为另一个状态。这应该是简单的,我认为我实现它是正确的,但我有40个bug,我认为它与include有关。下面是我的代码的外观: 游戏 #pragma once #include <SFML/Graphics.hpp> #include "GameState.h" #include "Menu.h" #incl

嘿,我试图为我的游戏实现状态机,我想测试一些东西。 所以现在我的机器有两个状态暂停和菜单,每一个都打印一个纹理,如果我按下鼠标,它应该会变为另一个状态。这应该是简单的,我认为我实现它是正确的,但我有40个bug,我认为它与include有关。下面是我的代码的外观:

游戏

#pragma once
#include <SFML/Graphics.hpp>
#include "GameState.h"
#include "Menu.h"
#include "Pause.h"
class Game
{
public:
    sf::RenderWindow* window;
    sf::Event evnt;
    GameState *state;  // current state

    sf::Texture text1;
    sf::Texture text2;

    sf::Sprite sText1;
    sf::Sprite sText2;

    void start();  // Main loop
    void print1(); // Prints one graphic
    void print2(); // Prints second one
    void update();// Prints based on current state

    void handleInput();  // check for input
    Game();
};
配子状态

#pragma once
#include "Game.h"

class GameState
{
protected:

public:

    virtual void Update(Game &gra )=0;
    virtual GameState* handleInput(sf::Event evnt)=0;

};

暂停


#pragma once
#include "GameState.h"
#include "Menu.h"
class Pause:public GameState
{
public:

     void Update(Game& gra);
     GameState* handleInput(sf::Event evnt);
};

暂停.cpp


#include "Pause.h"

void Pause::Update(Game& gra)
{
    gra.print1();
}

GameState* Pause::handleInput(sf::Event evnt)
{

    if (evnt.type == sf::Event::MouseButtonPressed)
    {
        return new Menu();
    }
    else
    {
        return NULL;
    }
}
Menu类的工作原理相同,只返回Pause类

这里是错误,怀疑它们是否有帮助

Severity    Code    Description Project File    Line    Suppression State
Error   C2061   syntax error: identifier 'Game' sfml    C:\Programowanie\Nauka\sfml\sfml\GameState.h    11  
Error   C2061   syntax error: identifier 'Game' sfml    C:\Programowanie\Nauka\sfml\sfml\Pause.h    9   
Error   C2660   'GameState::Update': function does not take 1 arguments sfml    C:\Programowanie\Nauka\sfml\sfml\Game.cpp   52  
Error   C2061   syntax error: identifier 'Game' sfml    C:\Programowanie\Nauka\sfml\sfml\Menu.h 9   
Error   C2504   'GameState': base class undefined   sfml    C:\Programowanie\Nauka\sfml\sfml\Pause.h    6   
Error   C2143   syntax error: missing ';' before '*'    sfml    C:\Programowanie\Nauka\sfml\sfml\Pause.h    10  
Error   C2061   syntax error: identifier 'Game' sfml    C:\Programowanie\Nauka\sfml\sfml\Pause.h    9   
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    sfml    C:\Programowanie\Nauka\sfml\sfml\Pause.h    10  
Error   C2238   unexpected token(s) preceding ';'   sfml    C:\Programowanie\Nauka\sfml\sfml\Pause.h    10  
Error   C2504   'GameState': base class undefined   sfml    C:\Programowanie\Nauka\sfml\sfml\Menu.h 6   
Error   C2061   syntax error: identifier 'Game' sfml    C:\Programowanie\Nauka\sfml\sfml\Menu.h 9   
Error   C2143   syntax error: missing ';' before '*'    sfml    C:\Programowanie\Nauka\sfml\sfml\Menu.h 10  
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    sfml    C:\Programowanie\Nauka\sfml\sfml\Menu.h 10  
Error   C2238   unexpected token(s) preceding ';'   sfml    C:\Programowanie\Nauka\sfml\sfml\Menu.h 10  
Error   C2143   syntax error: missing ';' before '*'    sfml    C:\Programowanie\Nauka\sfml\sfml\Game.h 11  
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    sfml    C:\Programowanie\Nauka\sfml\sfml\Game.h 11  
Error   C2238   unexpected token(s) preceding ';'   sfml    C:\Programowanie\Nauka\sfml\sfml\Game.h 11  
Error   C2504   'GameState': base class undefined   sfml    C:\Programowanie\Nauka\sfml\sfml\Pause.h    6   
Error   C2061   syntax error: identifier 'Game' sfml    C:\Programowanie\Nauka\sfml\sfml\Pause.h    9   
Error   C2143   syntax error: missing ';' before '*'    sfml    C:\Programowanie\Nauka\sfml\sfml\Pause.h    10  
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    sfml    C:\Programowanie\Nauka\sfml\sfml\Pause.h    10  
Error   C2238   unexpected token(s) preceding ';'   sfml    C:\Programowanie\Nauka\sfml\sfml\Pause.h    10  
Error   C2143   syntax error: missing ';' before '*'    sfml    C:\Programowanie\Nauka\sfml\sfml\Game.h 11  
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    sfml    C:\Programowanie\Nauka\sfml\sfml\Game.h 11  
Error   C2440   'return': cannot convert from 'Pause *' to 'GameState *'    sfml    C:\Programowanie\Nauka\sfml\sfml\Menu.cpp   15  
Error   C2238   unexpected token(s) preceding ';'   sfml    C:\Programowanie\Nauka\sfml\sfml\Game.h 11  
Error   C2504   'GameState': base class undefined   sfml    C:\Programowanie\Nauka\sfml\sfml\Menu.h 6   
Error   C2061   syntax error: identifier 'Game' sfml    C:\Programowanie\Nauka\sfml\sfml\Menu.h 9   
Error   C2143   syntax error: missing ';' before '*'    sfml    C:\Programowanie\Nauka\sfml\sfml\Menu.h 10  
Error   C2238   unexpected token(s) preceding ';'   sfml    C:\Programowanie\Nauka\sfml\sfml\Menu.h 10  
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    sfml    C:\Programowanie\Nauka\sfml\sfml\Menu.h 10  
Error   C2143   syntax error: missing ';' before '*'    sfml    C:\Programowanie\Nauka\sfml\sfml\Game.h 11  
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    sfml    C:\Programowanie\Nauka\sfml\sfml\Game.h 11  
Error   C2238   unexpected token(s) preceding ';'   sfml    C:\Programowanie\Nauka\sfml\sfml\Game.h 11  
Error   C2440   'return': cannot convert from 'Menu *' to 'GameState *' sfml    C:\Programowanie\Nauka\sfml\sfml\Pause.cpp  14  
Error   C2061   syntax error: identifier 'Game' sfml    C:\Programowanie\Nauka\sfml\sfml\GameState.h    11  
Error   C2061   syntax error: identifier 'Game' sfml    C:\Programowanie\Nauka\sfml\sfml\Pause.h    9   
Error   C2061   syntax error: identifier 'Game' sfml    C:\Programowanie\Nauka\sfml\sfml\Menu.h 9   



您有一个循环依赖项,其中
Game.h
包括
Gamestate.h
,反之亦然。在前者中,您可以替换完整的include

#pragma once
#include <SFML/Graphics.hpp>
#include "GameState.h"         // full include
#include "Menu.h"
#include "Pause.h"
class Game
{
    ...
#pragma一次
#包括
#包括“GameState.h”//完全包括
#包括“Menu.h”
#包括“暂停.h”
班级游戏
{
...
而是用一个向前的声明

#pragma once
#include <SFML/Graphics.hpp>
#include "Menu.h"
#include "Pause.h"

class GameState;    // forward declaration

class Game
{
    ...
#pragma一次
#包括
#包括“Menu.h”
#包括“暂停.h”
类GameState;//转发声明
班级游戏
{
...

然后你可以在你的
Game.cpp

文件中包含“GameState.h”
,你有一个循环依赖,其中
Game.h
包含
GameState.h
,反之亦然。在前者中,你可以替换你的完整包含

#pragma once
#include <SFML/Graphics.hpp>
#include "GameState.h"         // full include
#include "Menu.h"
#include "Pause.h"
class Game
{
    ...
#pragma一次
#包括
#包括“GameState.h”//完全包括
#包括“Menu.h”
#包括“暂停.h”
班级游戏
{
...
而是用一个向前的声明

#pragma once
#include <SFML/Graphics.hpp>
#include "Menu.h"
#include "Pause.h"

class GameState;    // forward declaration

class Game
{
    ...
#pragma一次
#包括
#包括“Menu.h”
#包括“暂停.h”
类GameState;//转发声明
班级游戏
{
...

然后您可以
#包括“GameState.h”
在你的
游戏.cpp
文件中,当你输入你的评论时,我正在更新我的帖子。我想你有一个循环include path循环。相关:这里与循环依赖相关。在这种情况下,你可能可以在
游戏.h
中转发声明
游戏状态
,而不是
包含“GameState.h”
按照这些思路,您还可以做一些其他事情,比如在
GameState.hpp
中向前声明
Game
,或者在
Game.h
中不包含
Menu.h
Pause.h
,只在
Game.cpp
中包含
Menu.h
。在这种情况下,不一定会有很大的区别,但是可以考虑在哪些点中需要多少细节。您不需要完整的类定义来声明指针类型的变量或声明函数签名。当您键入注释时,我正在更新我的帖子。我认为您有一个循环include path循环。Related:Related关于循环依赖项。在本文中案例您可能可以在
Game.h
中向前声明
GameState
,而不是
#包括“GameState.h”
按照这些思路,您还可以做一些其他事情,比如在
GameState.hpp
中向前声明
Game
,或者在
Game.h
中不包含
Menu.h
Pause.h
,只在
Game.cpp
中包含
Menu.h
。在这种情况下,不一定会有很大的区别,但是考虑在哪些点上需要多少细节是很好的。声明指针类型的变量或声明函数签名不需要完整的类定义。谢谢你,它可以工作。谢谢你,它可以工作。