2016-09-22 7 views
0

私はいくつかのOOPを学び、条件付きを取り除くことに決めました(このプログラムではこのことは不要ですが、私は単純な例から始める必要があります)。クラスDirectConditionsC++フレンドクラスの不完全な型の無効な使用OOP

、私は私の条件を持っていると私はsの方法「DirectConditionsでのSnakeGameのいくつかの変数の方法と変更値を」DirectConditions友人のクラスを参照することによりSnakeGameのオブジェクトを渡します。

エラー

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

別の質問

は私が尋ねるためにこの機会を取る可能性があります。この方法では、条件文を取り除くために(だ場合は)良いのですか?私は本当に助けに感謝します。

コードの提供:

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 
+0

'snakeGame.cpp'ファイルを作成します。このファイルには、' snakeGame.hpp'と 'directConditions.hpp'の両方が含まれています。次に、 'snakeGame.hpp'の関数の定義を' snakeGame.cpp'に移動します。 – PcAF

答えて

1

をあなたがお互いによりヘッダの含め避けるべきです - それが理由ですあなたは "不完全な型の無効な使用"を取得しています。 これを変更して、宣言を転送し、メソッドの実装をcppファイルに移します。

+0

これで、宣言だけで 'directConditions.hpp'と' snakeGame.hpp'を、 'hpp'ファイルと両方で' snakeGame.cpp'を実装しました。 'main.cpp'には、' snakeGame.hpp'が含まれています。ここには 'directConditions.hpp'が含まれていますが、エラーは同じですか、私は間違っていますか? ; /応答してくれてありがとう。 – Klemens

+0

申し訳ありませんが、現在作業中です!どうもありがとう ! – Klemens

関連する問題