我正在尝试创建一个函数,它在displayobject对象的向量中呈现所有内容(在另一个线程上)。我正在使用SDL线程。
这是displayobject.h:
class DisplayObject
{
protected:
int width;
int height;
int x;
int y;
SDL_Texture* texture;
SDL_Renderer* renderer;
public:
~DisplayObject();
int getX();
void setX(int x);
int getY();
void setY(int y);
int getWidth();
void setWidth(int width);
int getHeight();
void setHeight(int height);
SDL_Texture* getTexture();
SDL_Renderer* getRenderer();
};
在graphics.h中,我有以下变量:
std::vector<DisplayObject> imgArr;
SDL_Thread* renderThread;
static int renderLoop(void* vectorPointer);
此代码位于图形构造函数中:
TextLabel textLabel(graphics->getRenderer(), 300, 80, "Hallo Welt", 50, Color(255, 0, 255), "Xenotron.ttf");
//TextLabel inherits from DisplayObject
imgArr.push_back(textLabel);
renderThread = SDL_CreateThread(Graphics::renderLoop, "renderLoop", &imgArr);
这是渲染循环功能:
int Graphics::renderLoop(void* param)
{
int counter = 0;
bool rendering = true;
std::vector<DisplayObject>* imgArr = (std::vector<DisplayObject>*)param;
while (rendering)
{
cout << imgArr->size() << endl;
counter++;
if (counter > 600)
{
rendering = false;
}
SDL_Delay(16);
}
return 0;
}
问题是它只在控制台中打印0。为什么这样做?因为我将对象推入其中,所以应该写1。
答案 0 :(得分:3)
将TextLabel
插入std::vector<DisplayObject>
时,向量中存储的内容不是原始TextLabel
对象,而是DisplayObject
复制构造的TextLabel
1}}。您要做的是使用TextLabel
创建new
,存储指针,并在不再需要时调用delete
。
最佳解决方案是使用boost::ptr_vector<DisplayObject>
代替 - 当您从中删除对象时,它会自动调用delete
。
http://www.boost.org/doc/libs/1_57_0/libs/ptr_container/doc/ptr_container.html
如果您不能使用Boost,但可以使用C ++ 11,则可以使用std::vector<std::unique_ptr<DisplayObject>>
。