在向阵列写入数据时写入一次违规

时间:2016-06-29 08:26:24

标签: c++ arrays struct

我正在尝试访问构造函数中的SDL_Rect*数组,但每次我都会得到Write access violation。我尝试了多种解决方案,但没有一种适合我。

我目前拥有的内容:我制作了一个struct的数组:SDL_Rect* rects[50]

然后我尝试使用

访问数据
this->rects[index]->x = x;

这导致写入访问违规。

我还尝试删除数组(SDL_Rect* rects)并使用

访问数据
rects->y = y;

但这也导致了写入访问冲突。

数组会很精彩,但每次尝试我都会得到前面提到的异常,这是不是可以实现的?

rects.cpp:

namespace SDLGamecore {
namespace graphics {

    Rects::Rects(int x, int y, int w, int h)
    {
        rects->x = x; //Exception thrown: write access violation.
        rects->y = y;
        rects->w = w;
        rects->h = h;
        rectsSize += 1; //this works...
    }

    Rects::~Rects()
    {
        delete[] rects;
    }

    SDL_Rect* Rects::getRects()
    {
        return rects;
    }

    int Rects::getRectsSize()
    {
        return rectsSize;
    }

}}

rects.h:

namespace SDLGamecore { namespace graphics {
    class Rects
    {
    private:
        //SDL_Rect rects[50];
        SDL_Rect* rects;
        int rectsSize = 0;
    public:
        Rects(int x, int y, int w, int h);
        ~Rects();
    public:
        SDL_Rect* getRects();
        int getRectsSize();
    };
}}

typedef struct SDL_Rect
{
    int x, y;
    int w, h;
} SDL_Rect;

2 个答案:

答案 0 :(得分:1)

您忘记在构造函数中分配rects,它只是一个指针:

rects = new SDL_Rect[50];

那就是说,我不使用数组/ ptr,而是使用std::vector<SDL_Rect>

答案 1 :(得分:0)

您无法使用构造函数将SDL_Rect“添加”到rects,因为构造函数会创建一个新的rects。实际上,我认为您不需要自定义结构来保存SDL_Rect的数组/列表,只需使用std::vector,例如在你的主要:

std::vector<SDL_Rect> rects;
rects.push_back({1, 1, 4, 5}); // Add a SDL_Rect with x=1, y=1, w=4, h=5
rects.push_back({1, 4, 2, 3});

然后,当你需要调用render时:

SDL_RenderDrawRects(rendered, rects.data(), rects.size());

如果你真的想使用自定义,例如Shape结构,然后在内部使用std::vector

class Shape {
    std::vector<SDL_Rect> _rects;
public:
    Shape () { }

    void addRect (int x, int y, int w, int h) {
        _rects.push_back({x, y, w, h});
    }

    const std::vector<SDL_Rect>& getRects () const { return _rects; }

};

然后在main

Shape shape;
shape.addRect(1, 1, 4, 5);
shape.addRect(1, 4, 2, 3);
SDL_RenderDrawRects(renderer, shape.getRects().data(), shape.getRects().size());

或者您可以直接从Shape继承std::vector<SDL_Rect>

class Shape: std::vector<SDL_Rect> {
    void addRect (int x, int y, int w, int h) {
        this->push_back({x, y, w, h});
    }
};

Shape shape;
shape.addRect(1, 1, 4, 5);
shape.addRect(1, 4, 2, 3);
SDL_RenderDrawRects(renderer, shape.data(), shape.size());