2016-09-22 71 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