当通过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);
}