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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:36:04