c – 无法访问的基类
我正在用SDL写一个简单的游戏.我有一个类heirarchy,我正在构建我在游戏中使用的任何精灵.基类是Sprite,它包含碰撞框和spritesheet的数据抽象.直接在它下面是两个抽象类,Character和MapObject.
我目前正在实现从Character派生的Player类(Enemy和NPC也将派生自抽象Character类). 无论如何,希望这是有道理的.我的问题是: 当我尝试在引擎中使用播放器类时,我无法访问任何Sprite函数. 我收到以下错误: 'Sprite' is not an accessible base of 'Player' 以下是头文件: Sprite.h: class Sprite{ public: virtual ~Sprite() = 0; //I want this to be an abstract class and yes this is defined in the cpp //Initialization functions - MUST be called before anything else in the class can be used. void setupCollider(int xo,int yo,int ho,int wo); void setupSheet(SDL_Surface* dest,std::string file,int numClips,int ac,int _res,int sr); //SpriteSheet functions void setActiveClip(int a); int getActiveClip() const; void draw() const; int getResolution() const; SDL_Surface* getDest(); //Collider functions void updateCollider(); SDL_Rect box() const; bool collision(SDL_Rect other) const; //Access and Modify coordinates of the sprite void setLoc(int x,int y) { _x = x; _y = y; } int getX() const { return _x; } int getY() const { return _y; } private: struct Collider{ SDL_Rect _box; int x_offset,y_offset; }; struct SpriteSheet{ SDL_Surface* destination; SDL_Surface* sheet; SDL_Rect* clips; int _numClips; int active; int res; int sheetrows; }; Collider collisionAttributes; SpriteSheet spriteSheetAttributes; int _x,_y; }; Character.h: class Character : public Sprite{ public: virtual void move(Direction direction_input,const TileMap& currentlevel) = 0; virtual void animate() = 0; virtual void setAttributes( int h,int sp,int ad,int d,int m,int md,int l,std::string n){ hearts = h; speed = sp; attackdamage = ad; defense = d; magicdamage = m; magicdefense = md; level = l; name = n; } bool isDead() const{ return hearts == 0; } void heal(int heartsup){ hearts += heartsup; } void dealDamage(int heartsDown){ hearts -= heartsDown; } protected: int hearts; int speed; int attackdamage; int defense; int magicdamage; int magicdefense; int level; std::string name; }; Player.h: //Not fully finished yet,but should work for the purposes of this question class Player : protected Character{ public: ~Player(){ if(heart) SDL_FreeSurface(heart); } static const int HEART_WIDTH; void move(Direction direction_input,const TileMap& currentlevel); void animate(); void updateCamera(TileMap& currLevel); private: SDL_Surface* heart; enum ClipFace { UP1,UP2,DOWN1,DOWN2,LEFT1,LEFT2,RIGHT1,RIGHT2 }; static const std::string HEART; static const int HEART_RES; }; 当我尝试从播放器中的Sprite调用设置函数时,我的引擎中出现第一个错误,第一个错误是: player.setLoc(levels[0].startX(),levels[0].startY()); 任何和所有的帮助表示赞赏. [已解决]编辑:注释的替代解决方案:字符类没有从Sprite类继承任何东西,因此它在技术上不必从它派生.我没有从Sprite继承Character,而是让Player继承了BOTH Sprite和Character,这也很有用.我不确定什么是更好的设计. 解决方法
我想你需要改变
class Player : protected Character{ 至 class Player : public Character{ 这样,您就可以从程序中任何位置创建的Player实例访问Player对象上的Character和Sprite函数. 如果一个玩家应该能够做一个角色可以做的任何事情,公共继承是有道理的.没有理由在Player中隐藏可在Character或Sprite对象中自由访问的内容. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |