0

私はいくつかの OOP を学ぶことに決め、条件を取り除き始めました (このプログラムではこれが不要であることはわかっていますが、単純な例から始めなければなりません)。

classには条件があり、友人の class のメソッドへの参照によってDirectConditionsのオブジェクトを渡し、 inのメソッドのいくつかの変数の値を変更します。SnakeGameDirectConditionsSnakeGameDirectConditions

エラー:

invalid use of incomplite type 'class DirectConditions::SnakeGame' snakeObj.snake[0].xCoor+=1;

別の質問:

この機会に質問してもよろしいですか: 条件 (if) を取り除くこの方法は良いですか? 助けていただければ幸いです。

コードの提供:

snakeGame.hpp :

#ifndef _SNAKEGAME_HPP
#define _SNAKEGAME_HPP
#include<string>
#include"directConditions.hpp"
#include<map>

class SnakeGame{
    public:
        SnakeGame();
        void mainLogic();
        void check();

        friend class DirectConditions;

    private:
        const int width,height;
        int sizeOfSnake;
        std::string direction;
        std::map<std::string,DirectConditions*> directMap;


        struct Snake{ int xCoor,yCoor; }snake[100];
        enum Directions{up,down,left,right} directEnum;
        void initializeMap();
};
SnakeGame::SnakeGame():width(500),height(500),sizeOfSnake(3){}

void SnakeGame::check(){
    for(int i=sizeOfSnake;i>0;--i){
        snake[i].xCoor=snake[i-1].xCoor;
        snake[i].yCoor=snake[i-1].yCoor;
    }
    directMap[direction].goToDirection(this);
}
//private fun
    void SnakeGame::initializeMap(){
        directMap["right"]=new GoRight;
        directMap["left"]=new GoLeft;
        directMap["up"]=new GoUp;
        directMap["down"]=new GoDown;
    }


#endif 

directConditions.hpp :

#ifndef _DIRECTCONDITIONALS_HPP
#define _DIRECTCONDITIONALS_HPP
#include"snakeGame.hpp"

class DirectConditions{
    public:
        class SnakeGame;
        virtual void goToDirection(SnakeGame&)=0;
        virtual ~DirectConditions(){};
};

class GoRight:public DirectConditions{
    public:
        void goToDirection(SnakeGame& snakeObj){
            snakeObj.snake[0].xCoor+=1;
        }
};

class GoLeft:public DirectConditions{
    public:
        void goToDirection(SnakeGame& snakeObj){
            snakeObj.snake[0].xCoor-=1;
        }
};

class GoUp:public DirectConditions{
    public:
        void goToDirection(SnakeGame& snakeObj){
            snakeObj.snake[0].yCoor+=1;
        }
};

class GoDown:public DirectConditions{
    public:
        void goToDirection(SnakeGame& snakeObj){
            snakeObj.snake[0].yCoor-=1;
        }
};

#endif
4

1 に答える 1

1

相互にヘッダーを含めることは避ける必要があります。そのため、「不完全な型の無効な使用」が発生しています。これらのインクルードを変​​更して宣言を転送し、メソッドの実装を cpp ファイルに移動します。

于 2016-09-22T10:43:26.363 に答える