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

单例模式Engine类中私有成员mRenderer的修改方法咨询

解决方法

你的Engine类是单例模式,mRenderer是私有成员变量,当前只提供了获取它的getRenderer()方法,没有修改的入口。要实现像操作全局变量一样修改它的值,有几种可行方式:

1. 添加setRenderer成员方法(推荐)

在Engine类的public区域新增一个设置方法,既能安全修改私有成员,还能在方法内添加资源校验或释放逻辑:

class Engine
{
    // 原有代码...
public:
    // 新增设置方法
    void setRenderer(SDL_Renderer* newRenderer) {
        // 可选:如果旧渲染器未释放,先清理资源
        // if (mRenderer != nullptr) {
        //     SDL_DestroyRenderer(mRenderer);
        // }
        mRenderer = newRenderer;
    }
    // 原有getRenderer等方法...
};

之后就能这样修改:

// 假设已创建新的SDL_Renderer实例newRend
Engine::getInstance()->setRenderer(newRend);

2. 修改getRenderer返回指针的引用

如果想直接通过获取接口修改(贴近操作全局变量的体验),可以把getRenderer的返回值改成指针的引用:

class Engine
{
    // 原有代码...
public:
    SDL_Renderer*& getRenderer() {
        return mRenderer;
    }
    // 原有其他方法...
};

使用时直接赋值即可:

Engine::getInstance()->getRenderer() = newRenderer;

⚠️ 注意:这种方式会降低封装性,外部可随意修改成员,容易引发资源泄漏(比如旧渲染器未释放就被覆盖),需要手动管理资源。

3. 不推荐:将mRenderer改为public成员

直接把mRenderer从private移到public区域:

class Engine
{
public:
    SDL_Renderer *mRenderer;
    // 原有其他方法...
private:
    // 原有私有成员...
};

然后直接修改:

Engine::getInstance()->mRenderer = newRenderer;

这种方式破坏了类的封装性,外部可随意访问修改,不利于代码维护和安全,不建议使用。

另外提个小问题:你原代码里getRenderer()方法重复定义了两次,编译会报错,记得删掉其中一个。如果是多线程环境,当前单例的getInstance()实现也存在线程不安全的问题,需要加锁保护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:42:16