首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从具有移动语义的类对象中创建共享指针

如何从具有移动语义的类对象中创建共享指针
EN

Stack Overflow用户
提问于 2020-07-12 18:28:45
回答 2查看 62关注 0票数 1

这是我的Mesh object类

代码语言:javascript
复制
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);
}

现在我意识到我需要为这个类对象创建一个共享指针,但当我尝试这样做时,它会给我一个错误,试图引用一个已删除的函数,我相信这是因为我正在使用移动语义。

代码语言:javascript
复制
std::vector< texture> textures;
    Mesh m(textures);
    std::shared_ptr<Mesh> myMesh = std::make_shared<Mesh>(m);

有没有可能用移动语义从类对象中创建一个共享指针?

错误消息

错误C2280 ' Mesh ::Mesh(const Mesh &)':试图引用已删除的函数

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-12 18:33:36

如果添加了move构造函数,则默认的复制构造函数将被隐式删除,而std::make_shared<Mesh>(m)将使用复制构造函数。这就是您收到如下错误消息的原因:

代码语言:javascript
复制
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

代码语言:javascript
复制
Mesh m(textures);
std::shared_ptr<Mesh> myMesh = std::make_shared<Mesh>(std::move(m));

但是对于所显示的代码,您根本不清楚为什么要执行移动,因为您似乎没有将m用于其他任何事情。

票数 4
EN

Stack Overflow用户

发布于 2020-07-12 18:33:59

make_shared使用这些参数来构造Mesh。你要么想要

代码语言:javascript
复制
std::shared_ptr<Mesh> myMesh2 = std::make_shared<Mesh>(std::move(m));

代码语言:javascript
复制
std::shared_ptr<Mesh> myMesh = std::make_shared<Mesh>(textures);

若要选择两个未删除的构造函数之一,请执行以下操作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62859934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档