【问题标题】:Initialization list in singleton class单例类中的初始化列表
【发布时间】:2023-12-20 09:05:01
【问题描述】:

我决定重写我的代码并将所有原始指针替换为智能指针或引用之类的想法。但是,我对我的一些类(游戏、实体管理器、输入...)使用单例模式并且不知道如何初始化智能指针。问题是我使用SDL,我需要设置智能指针的删除器

std::unique_ptr<SDL_Window> window_(SDL_CreateWindow(...), SDL_DestroyWindow);

我通常会这样做,但是当指针是单例类的私有成员并且我不能将任何参数传递给类的构造函数(如窗口名称、宽度、高度...)。

class Game
{
private:
    std::unique_ptr<SDL_Window> window_;

    Game();
    ~Game();

public:
    static Game& getInstance();
};

感谢您的回答。

【问题讨论】:

    标签: c++ c++11 sdl smart-pointers raii


    【解决方案1】:

    你仍然可以使用成员初始化列表:

    Game::Game()
        : window_(SDL_CreateWindow(...), SDL_DestroyWindow)
    {
    }
    

    【讨论】:

    • 哦,我可能没有写对问题,我知道我可以,但是这样的问题是我不能从 int main() 向游戏传递任何参数,至少我不知道如何.
    • 好吧,您可以让实例保持未初始化状态并在单独的方法中对其进行初始化,例如setupSingleton(),如果在未设置单例时访问它,则抛出异常。顺便说一句,Singleton 是一种反模式,很少有合法用途。您的使用似乎假设将全局变量称为单例会使它们以某种方式受到祝福!它没有。