You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SFML问题:调用push_back()后Platform对象消失

问题分析与解决方案

核心问题:错误的拷贝构造函数

你自定义的Platform拷贝构造函数完全没有复制原对象的状态,而是每次都创建一个新的、位于屏幕底部的平台。当std::vector调用push_back添加新元素时,如果当前容量不足,会自动扩容:重新分配一块更大的内存,然后把旧内存里的所有Platform元素拷贝到新内存中。这时候你的错误拷贝构造函数会把所有旧平台重置成初始位置(屏幕底部),看起来就像之前的平台突然消失了。

另外,你的默认构造函数用了= default,导致默认构造的Platform内部的shape是未初始化的(大小为0,位置(0,0)),这会让第一次创建的平台无法正常显示,直到vector扩容时被拷贝构造函数重置。

修复步骤

1. 修复拷贝构造函数(或直接删除)

要么让拷贝构造函数正确复制原对象的shape:

Platform::Platform(const Platform& platform) : shape(platform.shape) {}

要么直接删除自定义的拷贝构造函数,让编译器自动生成默认的拷贝构造函数——默认的拷贝构造函数会正确复制所有成员变量(包括shape),完全能满足需求。

2. 正确初始化默认构造函数

把默认构造函数改成能初始化平台初始状态的版本,这样默认构造的Platform一开始就有正确的大小和位置:

Platform() {
    shape.setSize(sf::Vector2f(300.f, 40.f));
    shape.setPosition(1920.f / 2.f - shape.getSize().x / 2.f, 1080.f);
}

3. 优化getShape函数(可选但推荐)

当前getShape返回的是shape的拷贝,每次绘制都会额外复制一次sf::RectangleShape,改成返回引用可以避免不必要的性能开销:

// 用于修改shape的情况
sf::RectangleShape& getShape() { return shape; }
// 用于仅读取(比如绘制)的情况,更安全
const sf::RectangleShape& getShape() const { return shape; }

修改后,std::vector扩容时会正确复制现有平台的状态,旧平台的位置不会被重置,新平台也能正常初始化并向上移动。

内容的提问来源于stack exchange,提问作者redacted

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 10:27:27