当通过const引用传递的对象被添加到像std::map这样的容器时,会发生什么? 我在理解C++中对象所有权的概念方面有问题。 给你一点背景,我用Visual Studio 2013在Windows上使用SFML 2.1在C++ 11中编写一个小应用程序。

当通过const引用传递的对象被添加到像std::map这样的容器时,会发生什么? 我在理解C++中对象所有权的概念方面有问题。 给你一点背景,我用Visual Studio 2013在Windows上使用SFML 2.1在C++ 11中编写一个小应用程序。,c++,c++11,map,std,sfml,C++,C++11,Map,Std,Sfml,基本上,我编写了一个类AssetsManager来包装我的sf::Texture对象。我想将我的纹理存储在std::map中,以便能够使用键轻松地引用和查找它们。该映射是AssetManager类的私有成员 我有两个公共成员函数,用于“注册”(添加)贴图中的纹理对象,以及从贴图中获取纹理对象 以下是我在类标题中声明映射的方式: private: // Resources are mapped to a key for easy access. std::map < std:

基本上,我编写了一个类
AssetsManager
来包装我的
sf::Texture
对象。我想将我的纹理存储在
std::map
中,以便能够使用键轻松地引用和查找它们。该映射是
AssetManager
类的私有成员

我有两个公共成员函数,用于“注册”(添加)贴图中的纹理对象,以及从贴图中获取纹理对象

以下是我在类标题中声明映射的方式:

private:
    // Resources are mapped to a key for easy access.
    std::map < std::string, sf::Texture > m_textures;
在我的主要功能中,我执行以下操作:

AssetsManager assets;

sf::Texture myTexture;
myTexture.loadFromFile("Assets/MyCharacter.png");
assets.RegisterTexture("Hero Character", myTexture);
我不明白的是,在我的主函数中声明的
myTexture
变量会发生什么。 我将对象添加到地图中,因此可以通过调用

assets.GetTexture("Hero Character");
但是,我可以用主函数中的
myTexture
变量做些什么吗

两个物体是同一个吗?还是所有权从
myTexture
转移到地图中的对象,使得
myTexture
变得有些空

如果有人能澄清这一点,那就太好了,这样我就可以继续我的工作了

如果在这里使用指针是正确的选择,我甚至会绞尽脑汁,但我希望
AssetsManager
能够完全控制纹理,即“拥有”纹理,而不仅仅是指向对象的指针,如果你明白我的意思的话。

逐步分析:

m_textures.insert(std::make_pair(key, texture));
首先,
std::make_pair(T&&,U&&)
转发引用,并根据提供的参数实例化一对类型:
std::pair
。在您的情况下,这些类型如下所示:

T = const std::string&, std::decay_t<T> = std::string
U = const sf::Texture&, std::decay_t<U> = sf::Texture
它将使用参数直接在关联节点中放置一对

尽管如此,我觉得您应该为
sf::Texture
实例使用
std::shared_ptr
,因为顾名思义,它可以存储大量数据

另外,考虑重新实现您的<代码> GETFrase>成员函数(具有重载的const资格)以返回引用:


否则,每次调用
GetTexture
都会生成一个副本。

贴图正在保存纹理的副本。希望这就是你想要的。我最终在我的课堂上存储了std::shared_ptr。非常感谢。
T = const std::string&, std::decay_t<T> = std::string
U = const sf::Texture&, std::decay_t<U> = sf::Texture
m_textures.emplace(std::piecewise_construct
                 , std::forward_as_tuple(key)
                 , std::forward_as_tuple(texture));
sf::Texture& AssetsManager::GetTexture(const std::string& key)
//~~~~~~~~~^
{
    return m_textures[key];
}

const sf::Texture& AssetsManager::GetTexture(const std::string& key) const
//~~~~~~~~~~~~~~~^                                                   ~~~~^
{
    return m_textures.at(key);
}