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
相关产品推荐
相关产品推荐

