2016-09-22 85 views
0

我決定學習一些面向對象,我開始擺脫條件(我知道在這個程序中這是不必要的,但我必須從簡單的例子開始)。C++的朋友類無效的使用不完整的類型OOP

DirectConditions類,我有我的條件,我會通過引用「在DirectConditions方法與和的SnakeGame一些變量的變化值的方法傳遞的SnakeGame對象以友元類DirectConditions

錯誤

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.hpp'和'directConditions.hpp'的文件'snakeGame.cpp'。然後將'snakeGame.hpp'中的函數定義移動到'snakeGame.cpp' – PcAF

回答

1

你應該避免包括互相頭 - 這就是爲什麼你會得到「不完整類型的無效使用」。 更改這些包括轉發聲明並將方法的實現移動到cpp文件。

+0

好吧,我現在只有聲明和'snakeGame.cpp'有'directConditions.hpp'和'snakeGame.hpp'兩個'hpp'文件。在'main.cpp'中,我包含'snakeGame.hpp',其中包含'directConditions.hpp',錯誤是一樣的,我做錯了什麼? ; /感謝您的迴應。 – Klemens

+0

我很抱歉,現在正在工作!非常感謝 ! – Klemens