SFML调用自定义类getter返回的sf::Text无法通过draw()绘制问题
问题根因及修复方案
你代码里存在3个核心错误:
- 类成员未被正确赋值:TextManager构造函数中你重新定义了局部变量
sf::Text myText,你操作的是局部变量而非类的私有成员myText,构造函数执行结束后局部变量销毁,类成员myText始终是默认初始化的空对象。 - Font对象生命周期错误:SFML的
sf::Text仅保存指向sf::Font的指针,不会复制字体资源。你在构造函数中定义的局部sf::Font会在构造结束后销毁,sf::Text持有的指针变为野指针,渲染时无法读取字体数据自然无法显示。 - 对象实例化语法错误:main函数中
TextManager textManager();属于C++的「最令人头疼的解析」场景,这行代码被编译器判定为声明一个返回TextManager类型、无参数的名为textManager的函数,而非实例化TextManager对象。
修改后的代码
TextManager.h
#ifndef TEXTMANAGER_H #define TEXTMANAGER_H #include <SFML/Graphics.hpp> class TextManager { public: TextManager(); virtual ~TextManager(); // 这里建议返回引用避免复制,如果你需要每次返回修改后的对象也可以按值返回,但要保证font生命周期正常 sf::Text& getMyText(); private: sf::Font m_font; // 将Font作为类成员,保证生命周期和Text一致 sf::Text myText; }; #endif // TEXTMANAGER_H
TextManager.cpp
#include "TextManager.h" TextManager::TextManager() { // 操作类成员font而非局部变量 m_font.loadFromFile("arial.ttf"); // 直接操作类成员myText,不要重新声明局部变量 myText.setString("现在可以正常显示啦 :-)"); myText.setFont(m_font); myText.setPosition(sf::Vector2f(164,0)); myText.setCharacterSize(25); myText.setFillColor(sf::Color::Blue); } sf::Text& TextManager::getMyText() { return myText; } TextManager::~TextManager() { }
main.cpp
int main() { // 窗口创建逻辑略 // ... sf::Font font; font.loadFromFile("arial.ttf"); sf::Text mainTxt("It works !!",font); // 你原代码这里的setPosition参数写错了,第二个参数不该是字符串,应该是数字 mainTxt.setPosition(sf::Vector2f(64, 0)); mainTxt.setCharacterSize(25); mainTxt.setFillColor(sf::Color::Blue); // 去掉括号,正确实例化对象 TextManager textManager; sf::Event event; while (window.isOpen()) { // 事件处理逻辑略 // ... window.draw(mainTxt); window.draw(textManager.getMyText()); window.display(); window.clear(); } return 0; }
内容的提问来源于stack exchange,提问作者Grezami Soit
相关产品推荐
相关产品推荐

