gpt4 book ai didi

c++ - 不可访问的基类

转载 作者:可可西里 更新时间:2023-11-01 18:25:44 25 4
gpt4 key购买 nike

我正在用 SDL 编写一个简单的游戏。我有一个类层次结构,我正在为我在游戏中使用的任何 Sprite 构建它。基类是 Sprite,它包含碰撞框和 spritesheet 的数据抽象。在其正下方是两个抽象类,Character 和 MapObject。

我目前正在实现派生自 Character 的 Player 类(敌人和 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;

};

字符.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;

};

播放器.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 类继承任何东西,因此从技术上讲它不必从它派生。我没有让 Character 从 Sprite 继承,而是让 Player 从 BOTH Sprite 和 Character 继承,这也有效。不过我不确定什么是更好的设计。

最佳答案

我认为你需要改变

class Player : protected Character{

class Player : public Character{

通过这种方式,您可以从 Player 的实例访问 CharacterSpritePlayer 对象上的函数> 在您的程序中的任何位置创建。

如果 Player 应该能够做 Character 可以做的任何事情,那么 public 继承就有意义了。没有理由在 Player 中隐藏可以在 CharacterSprite 对象中自由访问的内容。

关于c++ - 不可访问的基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11919014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com