0

私が作成しているプログラムは、さまざまな種類のリソースのアクセス プールを必要としますが、アクセスできるクラスはわずかです。リソース プールも独自のクラスです。そのため、リソース プールに静的クラスを使用し、この方法で他のユーザーにアクセスさせることにしました。

しかし、プールにリソースを追加する際に奇妙な問題が発生しています。各プールは 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 を返します。テクスチャを使って何もしていないので、このプログラムはクラッシュしません。今のところ挿入をテストしているだけです。

4

1 に答える 1

0

質問には適切なコンパイル可能なプログラムが含まれていないため、作成しました:

#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 を使用して、私のマシンで期待どおりに動作します。元のポスターでうまくいくのだろうか。

于 2010-12-23T23:45:21.183 に答える