【问题标题】:std::map fails to insert objectsstd::map 无法插入对象
【发布时间】:2011-05-30 04:49:44
【问题描述】:

我正在制作的程序需要各种类型资源的访问池,但只有少数类可以访问。资源池也是它自己的类。因此,我决定为资源池使用一个静态类,并让其他人以这种方式访问​​它。

但是我在向池中添加资源时遇到了一个奇怪的问题。每个池都表示为一个 std::map,插入后,映射仍然为空。我猜这与静态类中的地图有关。这就是地图在这里无法按预期工作的原因吗?

资源池相关代码

class ResourcePool {

 private:
        static ResourcePool m_ResourcePool;

 public:
        ResourcePool();
        ~ResourcePool();
        static ResourcePool* Instance() { return &m_ResourcePool; }
  // Where textures are stored. ci_less is for case comparison of names
  std::map <std::string, TextureResource, ci_less> Textures;

  TextureResource* getTexture(std::string handle);
};

如何使用的相关代码

Scene::Scene() {

 Assets = ResourcePool::Instance();
}

TextureResource* Scene::add(std::string handle, TextureResource Texture) {

 // Insertion fails
 Assets->Textures.insert(std::make_pair(handle + "_tex", Texture));

 // I use this line to debug, the map still shows up empty
 unsigned size = Assets->Textures.size();

 // look up that texture by its name
 return Assets->getTexture(handle);
}

结果是,add 返回 NULL,因为没有找到任何东西。这个程序不会崩溃,因为我没有对纹理做任何事情,现在只是测试插入。

【问题讨论】:

  • 如果:static ResourcePool* Instance() 永远不会返回 NULL,那么让它返回一个引用。
  • Assets->Textures[handle + "_tex"] = Texture; ?
  • 需要查看代码 foe ci_less。如果您编写一个可运行并演示问题的小型可编译应用程序,将会简单得多。没有它只是有根据的猜测。无论如何,构建示例的过程可能会引导您找到答案。
  • Assets-&gt;Textures() :会不会碰巧有一个 Texture 成员函数,您没有显示但通过复制返回 map
  • Martin York,我从地图中删除了 ci_less 功能(这非常容易做到)并使用新格式再次调试。插入也有同样的问题。

标签: c++ stdmap static-classes


【解决方案1】:

由于问题不包含适当的可编译程序,我创建了一个:

#include <string>
#include <map>
#include <iostream>

class ResourcePool {

 private:
        static ResourcePool m_ResourcePool;

 public:
        static ResourcePool* Instance() { return &m_ResourcePool; }
        std::map <std::string, std::string> Textures;
        std::string getTexture(std::string handle) { return Textures[handle]; }
};

ResourcePool ResourcePool::m_ResourcePool;

int main()
{
    ResourcePool* Assets = ResourcePool::Instance();
    Assets->Textures.insert(std::make_pair("test_tex", "texture"));
    std::cout << Assets->Textures.size() << std::endl;
    std::cout << Assets->getTexture("test_tex") << std::endl;
    return 0;
}

这可以在我的机器上按预期使用 linux,g++ Debian 4.3.2-1.1。 我想知道它是否适用于原始海报。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 2020-02-06
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多