我正在尝试访问构造函数中的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;
答案 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());