混淆了用于将文件加载到对象的AssetManager的实现

时间:2018-06-02 18:45:48

标签: c++11 singleton

该实体的主要工作是提供Asset& Load(string path)多态接口。目前我TextureAsset : Asset只使用SpriteRenderer,但会有更多,例如AudioAsset : Asset。该实体还维护已加载资产的缓存。它目前是一个单身人士,因为我觉得这个类证明了使用通常避免的模式。但是我担心自己可能会过度热心/过于自信,并且当他们说'#34;过度使用模式"等等时,这是完全长老的意思/ p>

它应该是一个静态类而不是析构函数,因为单独的析构函数不会被调用直到应用程序结束?

它是否甚至不是一个类并且是命名空间中的过程函数?

它应该是常规类,是由Engine对象拥有和提供对象的引用吗?但它与Engine并不真正相关;理论上你可以让两个Engine个对象使用相同的AssetManager(没有实际的理由可以有两个Engine但我的代码结构并没有禁止它。继续通过这样一个孤儿"也是一种痛苦。周围的物体。

class AssetManager final {
public:
    static AssetManager& Instance() {
        static AssetManager instance;
        return instance;
    }

    template<typename T>
    std::shared_ptr<T> LoadAsset(const std::string& path) {
        static_assert(std::is_base_of<Asset, T>::value, "T needs to derive from Asset");
        // This assert works, but the error is generated on this line,
        // and VS2017 doesn't give any more info.
        // Is there a way for me to point to the illegal call instead?

        auto search = loaded.find(path);
        if (search != loaded.end()) {
            std::shared_ptr<Asset> asset = search->second;
            return std::dynamic_pointer_cast<T>(asset);
        }

        std::shared_ptr<T> t_ptr = std::make_shared<T>(path);
        loaded.insert(std::pair<std::string, std::shared_ptr<T> >(path, t_ptr));
        return t_ptr;
    }

    void Clear() {
        loaded.clear();
    }

private:
    AssetManager() = default;
    ~AssetManager() {
        loaded.clear();
    }
    AssetManager(const AssetManager&) = delete;
    AssetManager(AssetManager&&) = delete;
    AssetManager& operator=(const AssetManager&) = delete;
    AssetManager& operator=(const AssetManager&&) = delete;
    std::map<std::string, std::shared_ptr<Asset> > loaded;
};

0 个答案:

没有答案