2015-03-31 147 views
2

我想创建一个函数,呈现displayobject对象(在另一个线程上)的向量中的所有内容。我正在使用SDL线程。C++矢量大小为零

这里是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,因为我把对象放入它。

+1

在一个不相关的点上,仅仅因为一个函数想要一个指针参数并不意味着你传递的变量必须是一个指针。在需要时,可以使用地址 - 运算符'&'来创建一个指向变量的指针。 – 2015-03-31 16:40:41

+1

'新的std :: vector'通常是错误的。为什么不只是'std :: vector imgArr;'? – 2015-03-31 16:42:06

+0

@NeilKirk现在编辑 – 2015-03-31 16:48:36

回答

3

当你插入一个TextLabelstd::vector<DisplayObject>,什么是存储在向量是不是你原来的TextLabel对象,但是从TextLabel一个DisplayObject拷贝构造。你想要做的就是用new创建TextLabel,存储它们的指针,并在你不再需要时调用delete

最好的解决方案是使用boost::ptr_vector<DisplayObject>代替 - 当您从中删除对象时,它会自动调用deletehttp://www.boost.org/doc/libs/1_57_0/libs/ptr_container/doc/ptr_container.html

如果您不能使用Boost,但可以使用C++ 11,则可以使用std::vector<std::unique_ptr<DisplayObject>>