c++友类无效使用不完整的OOP类型

C++ friend class invalid use of incomplete type OOP

本文关键字:OOP 类型 用不完 无效 c++      更新时间:2023-10-16

我决定学习一些OOP,我开始摆脱条件(我知道在这个程序中这是不必要的,但我必须从简单的例子开始)。

DirectConditions类中,我有自己的条件,参照友类DirectConditions的方法传递SnakeGame的对象,在DirectConditions的方法中改变SnakeGame的一些变量的值。

误差

:

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

另一个问题:

我可以借此机会问:这种摆脱条件句(if’s)的方式是好的吗?我真的很感激你的帮助。

提供代码:

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

你应该避免包括头彼此-这就是为什么你得到"无效使用不完整类型"。更改这些包括转发声明和将方法的实现移动到cpp文件。