c++ - 如何从具有移动语义的类对象中创建共享指针
问题描述
这是我的网格对象类
struct texture
{
std::string textureName;
unsigned int textureId;
};
class Mesh
{
public:
/* Mesh data */
std::vector<texture> textures;
/* Functions */
Mesh(std::vector<texture> &text);
Mesh(const Mesh& mesh) = delete;
Mesh& operator = (const Mesh& mesh) = delete;
Mesh(Mesh &&other);
Mesh& operator=(Mesh &&other);
~Mesh();
};
#include "Mesh.h"
Mesh::Mesh(std::vector<texture> &text) : textures(text)
{
}
Mesh::Mesh(Mesh &&other) : textures( other.textures)
{
for (auto &tex : other.textures)
tex.textureId = 0;
}
Mesh& Mesh::operator=(Mesh &&other)
{
if (this != &other)
{
textures = other.textures;
}
for (auto &tex : other.textures)
tex.textureId = 0;
return *this;
}
Mesh::~Mesh()
{
for (auto &tex : textures)
glDeleteTextures(1, &tex.id);
}
现在我意识到我需要为此类对象创建一个共享指针,但是当我尝试这样做时,尝试引用已删除的函数时会出错,我相信这是因为我正在使用移动语义。
std::vector< texture> textures;
Mesh m(textures);
std::shared_ptr<Mesh> myMesh = std::make_shared<Mesh>(m);
是否可以从具有移动语义的类对象中创建共享指针?
错误信息
错误 C2280 'Mesh::Mesh(const Mesh &)': 试图引用已删除的函数
解决方案
如果添加移动构造函数,则默认复制构造函数将被隐式删除并std::make_shared<Mesh>(m)
使用复制构造函数。这就是您收到如下错误消息的原因:
error: use of deleted function 'constexpr Mesh::Mesh(const Mesh&)'
-> decltype(::new((void*)0) _Tp(std::declval<_Args>()...))
note: 'constexpr Mesh::Mesh(const Mesh&)' is implicitly declared as deleted
because 'Mesh' declares a move constructor or move assignment operator
std::move
如果你真的想移动,你需要使用:
Mesh m(textures);
std::shared_ptr<Mesh> myMesh = std::make_shared<Mesh>(std::move(m));
但是对于显示的代码,您根本不清楚为什么要进行移动,因为您似乎没有将其m
用于其他任何事情。
推荐阅读
- c# - lamda中的linq如何将其转换为正确的方式
- php - 如何将输入(onchange)中的文本写入 PHP/HTML 中的数组?
- go - 修改要编组为 JSON 的数据
- ruby-on-rails - 运行 rake db:schema:load 时出现“致命:角色“root”不存在”
- .net - Fluent API 关系:一对一或零关系ip
- python - Pyspark.ml.classification 或 Regression 算法有参数 'Maxiter' 它有什么作用?
- python - Python:替换 YAML 文件中的字符串
- sql-server - 从 Pentaho 数据集成勺读取 ms sql 数据时速度缓慢
- ruby - microsoft.com 的 OpenSSL SYSCALL 返回=5
- python - 为什么keyword.kwlist不包含'async'和'await'?