我正在製作一個SDL遊戲,它使用libconfig從文件讀取一些設置。問題是我創建了一個名爲ClipList
的類,其中包含一個std::vector<SDL_Rect>
來存儲設置,但是當嘗試將SDL_Rect
對象添加到該向量時,出於某種原因,push_back什麼都不做,最終得到一個空向量。C++ STD向量push_back似乎不工作
這是類:
class ClipList
{
public:
ClipList();
ClipList(int);
virtual ~ClipList();
void addClip(int,int,int,int);
void getClip(int,SDL_Rect*);
int getLength();
protected:
private:
std::vector<SDL_Rect> clips;
};
ClipList::ClipList(int l)
{
clips.reserve(l);
}
void ClipList::addClip(int x,int y,int w,int h){
SDL_Rect rect;
rect.x = x;
rect.y = y;
rect.w = w;
rect.h = h;
clips.push_back(rect);
}
void ClipList::getClip(int i,SDL_Rect* rect){
rect = &(clips.at(i));
}
int ClipList::getLength(){
return clips.size();
}
而這正是我初始化ClipList對象的功能。這個函數被main調用。
void set_clips(Config* placlips,ClipList* clips, ClipList* flipclips){
const Setting& root = placlips->getRoot();
int x,y,w,h;
try{
Setting& clipsett = root["clips"];
int cliplen = clipsett.getLength();
clips = new ClipList(cliplen);
flipclips = new ClipList(cliplen);
for(int i=0;i<cliplen;i++){
const Setting& c = clipsett[i];
if(!(c.lookupValue("x",x)&&c.lookupValue("y",y)&&c.lookupValue("w",w)&&c.lookupValue("h",h))){
continue;
}
clips->addClip(x,y,w,h);
}
}catch(const SettingNotFoundException &nfex){
cerr << "Setting not found at" << nfex.getPath() << endl;
}
}
不管ClipList
對象是否得到main
或set_clips
初始化,clips.push_back(rect)
不起作用。矢量的容量發生了變化,但是沒有對象被存儲,所以如果我試圖對矢量做其他事情,甚至檢查矢量是否爲空,我最終會出現段錯誤。
是的,這是問題所在,雖然通過引用傳遞指針得到的代碼來編譯'SDL_Rect'對象仍然沒有被存儲在內存中。我通過初始化'main'中的ClipList對象並通過引用而不是指針傳遞ClipList對象來解決問題。 – Magnus
@Magnus這也是一個很好的解決方案。 –