【发布时间】:2014-10-15 18:26:24
【问题描述】:
在我的程序中实现 ImageManager 时遇到问题。我成功地使用了这种方法和参考:
//definition in Brick.h
ImageManager &imgr;
//constructor taking &imgr as a reference upon creation of object
Brick::Brick(ImageManager &im) : imgr(im){
//imgr is now a reference in my class, so it points to the same object that imgr in another class would point to
//this essentially makes one "static" instance of imgr, so all my graphic objects are dealing with the same instance of my ImageManager
imgr.doStuff()
}
这种传递我的 imgr 的方法曾经有效,直到我开始尝试从向量中删除对象。例如,在我的 Level 类中,我尝试从 Brick 对象的向量中删除元素,
void Level::RemoveLine(int line){
//loop through every piece, loop through given piece's rects, if the rect falls on the removed line, then remove the piece
for(int i = 0; i < gamePieces_.size(); i++){
//crt new iterator per each gamepiece
auto write = gamePieces_[i].GetPieceRectangles().begin();
int j = 0;
for(auto read = write; read != gamePieces_[i].GetPieceRectangles().end(); read++){
if(gamePieces_[i].GetPieceRectangles()[j].GetActiveLine() != line){
if(read != write){
write = std::move(read);
}
write++;
}
}
gamePieces_[i].GetPieceRectangles().erase(write, gamePieces_[i].GetPieceRectangles().end());
}
}
但这不起作用,因为在Brick.h 中声明的ImageManager &imgr 没有复制构造函数,因此当我尝试 .erase() 元素时,它无法复制到向量中。我的目标是实现一个静态 ImageManager 对象,以便在我的所有课程中使用。我该怎么做呢?
【问题讨论】:
-
如果您尝试摆脱全局
ImageManager(这很好),请使用 std::shared_ptr,您可以轻松地传递它。 -
嗯,我的尝试是让它全球化,真的,但我明白你的意思。我实际上将引用定义
ImageManager &imgr切换为指针ImageManager *imgr并相应地更改了 imgr 的所有实例。那很好还是我应该实现一个 std::shared_ptr?
标签: c++ vector reference static