C++矢量大小为零

C++ Vector Size is Zero

本文关键字:小为 C++      更新时间:2023-10-16

我正在尝试创建一个函数,该函数可以渲染displayobject对象向量中的所有内容(在另一个线程上)。我正在使用SDL线程。

这是显示对象。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,因为我把对象推入其中。

std::vector<DisplayObject>中插入TextLabel时,矢量中存储的不是原始TextLabel对象,而是由TextLabel构建的DisplayObject副本。您要做的是使用new创建TextLabel,存储指向它们的指针,并在不再需要它们时调用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>>