Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;继承子类可修改变量_C++_Variables_Inheritance_Sdl_Overloading - Fatal编程技术网

C++ C++;继承子类可修改变量

C++ C++;继承子类可修改变量,c++,variables,inheritance,sdl,overloading,C++,Variables,Inheritance,Sdl,Overloading,帮助我理解如何在子类中使用超类变量并能够对其进行更改,我正在使用SDL库制作一个克隆空间入侵者2D游戏 首先,我有一个从SDL_Rect继承的矩形类,看起来像这样,我将省略不重要的部分 //Rectangle.h namespace galaxy{ struct Rectangle : public SDL_Rect{ Rectangle(); Rectangle(int xx, int yy, int hh, int ww); Rectangel centeredRe

帮助我理解如何在子类中使用超类变量并能够对其进行更改,我正在使用SDL库制作一个克隆空间入侵者2D游戏

首先,我有一个从SDL_Rect继承的矩形类,看起来像这样,我将省略不重要的部分

//Rectangle.h 
namespace galaxy{
struct Rectangle : public SDL_Rect{
    Rectangle();
    Rectangle(int xx, int yy, int hh, int ww);
    Rectangel centeredRect(int width, int height) const
    bool overlaps(const Rectangle& other) const;
    };

}
我将省略.cpp,因为很容易看出rectangel在其中扮演了什么角色,我不想让你们感到厌烦

然后我有一个精灵类,它是游戏中人物的超类

namespace galaxy{
class Sprite{
public:
virtual void draw() = 0;
virtual ~Sprite();

virtual void keyLeft(SDLKey k);
virtual void keyRight(SDLKey k);
......more buttons

protected:
Sprite(int x, int y, int h, int w);
private:
Rectangle rect;

Sprite (const Sprite&);
const Sprite& operator=(const Sprite&);
};
}
在.cpp文件中,我有以下代码

namespace galaxy{
Sprite::Sprite{int x, int y, int h , int w) : rect (x, y, h, w){}

Sprite::~Sprite(){}

const Rectangel& Sprite::getRect() const{
return rect;
}

void Sprite::keyLeft(SDLKey k){}
void Sprite::keyRight(SDLKey k){}
void Sprite::keyDown(SDLKey k){}
...more buttons
}
然后到问题所在的地方,我有另一个类Ship,我想重载超类中的keyLeft,让矩形rect跟在坐标后面,我需要更改子类中的x和y,但是在使用r.x++下面的构造时;在函数内运行,并且在退出函数时,在尝试到达Ship class I get error not ACCABLE中的rect时,通过r=getRect()获取rect时,矩形x的更改被清除;对r的更改仅在功能内,但船舶不会在屏幕上移动

//Ship.h
    namespace galaxy {

    class Ship : public Sprite{
    public:





        void keyLeft(SDLKey k);
        void keyRight(SDLKey k);
        void keyDown(SDLKey k);
        void keyUp(SDLKey k);
        void space(SDLKey k);

        Ship(int x, int y, int hits);
    private:
        SDL_Surface* ship;
        int hits;

    };
}

//Ship.cpp
using namespace std;


namespace galaxy{
Rectangel r;



    Ship::Ship(int x, int y, int hits) : Sprite(x, y, NULL, NULL), hits(hits){
        ship = IMG_Load("Ship.png");
    }


     //Here is where my problem is.....
        void Ship::keyLeft(SDLKey k){ 
            std::cout << "Im here!\n";    
            std::cout << r.getX(); // outputs 250
            r.x--;
            std::cout << r.getX(); // outputs 251
        }
        void Ship::keyRight(SDLKey k){
        std::cout << "Im here!\n";
        }
        void Ship::keyDown(SDLKey k){
        std::cout << "Im here!\n";
        }
        void Ship::keyUp(SDLKey k){
        std::cout << "Im here!\n";
        }
        void Ship::space(SDLKey k){
        std::cout << "Im here!\n";

        }


    void Ship::draw(){
        r = getRect();
        SDL_BlitSurface(ship, NULL, sys.screen, &r);

    }

}
//Ship.h
名称空间星系{
船舶类别:公共雪碧{
公众:
void keyLeft(SDLKey k);
无效密钥权限(SDLKey k);
无效键控键控(SDLKey k);
无效键控(SDLKey k);
空隙空间(SDLKey k);
船舶(整数x,整数y,整数命中);
私人:
SDL_水面*船舶;
整数命中率;
};
}
//Ship.cpp
使用名称空间std;
名称空间星系{
矩形r;
Ship::Ship(intx,inty,inthits):精灵(x,y,NULL,NULL),hits(hits){
ship=IMG_载荷(“ship.png”);
}
//这就是我的问题所在。。。。。
无效船::左键(SDLKey k){

如果你这样做:

Rectangel r;
...
r = getRect();
然后将原始矩形复制到r变量中,当您更改它时,原始的rectangle不会更改。 也许对于快速修复,您可以对您的船舶类实现setRect功能,以便实际能够写回修改后的数据

void Ship::setRect(const Rectangel& rr) { rect = rr; }

如果您这样做:

Rectangel r;
...
r = getRect();
然后将原始矩形复制到r变量中,当您更改它时,原始的rectangle不会更改。 也许对于快速修复,您可以对您的船舶类实现setRect功能,以便实际能够写回修改后的数据

void Ship::setRect(const Rectangel& rr) { rect = rr; }

如果您想直接从
Sprite
基类访问
rect
,则需要提供
rect
受保护的可见性,如下所示:

class Sprite
{
    [...]
protected:
    Rectangle rect;
    [...]
};

如果您想直接从
Sprite
基类访问
rect
,则需要提供
rect
受保护的可见性,如下所示:

class Sprite
{
    [...]
protected:
    Rectangle rect;
    [...]
};

必须使用虚拟函数进行多态性。必须使用虚拟函数进行多态性。您好,请您详细说明一下,该项目的要求是保持所有变量的私有性,是否有其他方法可以做到这一点并保持rect私有性?我继续,并在超类sprites中保护我的矩形,我声明了一个新的rectangle在Ship类中,很抱歉我错过了你的评论。问题是,你的类Ship继承自Sprite。因此,它是一种专门化,它向基类添加了更多的逻辑和/或数据。因此,它与基类紧密耦合。它是(根据我的经验)通常的做法是保护大多数成员,从而允许在派生类中直接访问。这并不真正违反信息隐藏的概念。大多数成员只有在有非常特殊的原因,即使是派生类也不应该直接接触它们的情况下才被声明为私有。您好,谢谢您的回答,是的,受保护的变量是最重要的在一个等级中最容易处理,这是一个学校作业,但出于某种原因,我们必须让所有变量都是私有的,不确定现在你提到了它,如果保护也被认为是私有的,当它在作业中说要保持它们的私有性时,我必须检查一下!再次感谢!RegardsHi,你能详细说明这一点吗这个项目是保持所有变量的私有性,还有其他方法可以做到这一点并保持rect私有吗?我继续在超类Sprite中保护我的矩形,我在Ship类中声明了一个新的Rectangel,很抱歉我错过了你的评论。问题是你的类Ship继承自Sprite。所以这是一个专门化,它是一个dds将更多的逻辑和/或数据发送到基类。因此,它与基类紧密耦合。这是(根据我的经验)通常的做法是保护大多数成员,从而允许在派生类中直接访问。这并不真正违反信息隐藏的概念。大多数成员只有在有非常特殊的原因,即使是派生类也不应该直接接触它们的情况下才被声明为私有。您好,谢谢您的回答,是的,受保护的变量是最重要的在一个等级中最容易处理,这是一个学校作业,但出于某种原因,我们必须让所有变量都是私有的,不确定现在你提到了它,如果在作业中说要保持它们的私有性,也考虑到了它是否受保护,我必须检查一下!再次感谢!问候