将旧代码转换为 std::move 语义 片段我的尝试

如何解决将旧代码转换为 std::move 语义 片段我的尝试

我想改进一些旧代码,因为它看起来很糟糕。我认为 std::move 可以完成它所做的事情,对吗?整个代码已发布在 this GitHub 上。但是,我只需要改进该特定结构 (Resource)。

用法是:

std::vector<Resource> ResourceHelper::resources;

bool ResourceHelper::EnumNamesFunc(HMODULE hModule,LPCWSTR lpType,LPWSTR lpName,LONG_PTR lParam)
{
    if (!IS_INTRESOURCE(lpName))
    {
        std::wcout << lpName << std::endl;
    }
    else if (IS_INTRESOURCE(lpName))
    {
        std::cout << reinterpret_cast<int>(lpName) << std::endl;
    }

    HRSRC hResource = hResource = FindResourceW(hModule,lpName,lpType);

    if (!hResource)
    {
        return false;
    }

    DWORD dwSize = SizeofResource(hModule,hResource);
    HGLOBAL hGlobal = LoadResource(hModule,hResource);

    if (!hGlobal)
    {
        return false;
    }

    LPVOID lpResource = LockResource(hGlobal);

    if (!lpResource)
    {
        return false;
    }

    resources.push_back(Resource(lpType,hGlobal,dwSize));

    FreeResource(lpResource);

    return true;
}

片段

struct resource
{
    LPCWSTR lpType;
    LPWSTR lpName;
    LPVOID lpData;
    DWORD dwSize;

    LPWSTR copy_string(LPCWSTR value)
    {
        if (IS_INTRESOURCE(value))
            return const_cast<LPWSTR>(value);

        int len = wcslen(value) + 1;
        LPWSTR copy = new WCHAR[len];
        memcpy(copy,value,sizeof(WCHAR) * len);
        return copy;
    }
    
    resource(LPCWSTR lpType,const wchar_t* lpName,LPVOID lpData,DWORD dwSize)
    {
        this->lpType = copy_string(lpType);
        this->lpName = copy_string(lpName);
        this->lpData = lpData;
        this->dwSize = dwSize;
    }
    
    resource(const resource& src)
    {
        this->lpType = copy_string(src.lpType);
        this->lpName = copy_string(src.lpName);
        this->lpData = src.lpData;
        this->dwSize = src.dwSize;
    }
    
    ~resource()
    {
        if (!IS_INTRESOURCE(lpType))
            delete[] lpType;

        if (!IS_INTRESOURCE(lpName))
            delete[] lpName;
    }
    
    resource& operator=(const resource& rhs)
    {
        if (&rhs != this)
        {
            resource copy(rhs);

            using std::swap;
            swap(this->lpType,copy.lpType);
            swap(this->lpName,copy.lpName);
            swap(this->lpData,copy.lpData);
            swap(this->dwSize,copy.dwSize);
        }

        return *this;
    }
};

我的尝试

class resource
{
public:
    resource() = default;

    resource(const resource&) = delete;

    resource(resource&& obj) noexcept
    {
        *this = std::move(obj);
    }

    ~resource()
    {
    }

    resource& operator=(const resource&) = delete;

    resource& operator=(resource&& rhs) noexcept
    {
        std::swap(type,rhs.type);
        std::swap(name,rhs.name);
        std::swap(lpData,rhs.lpData);
        std::swap(dwSize,rhs.dwSize);
        
        return *this;
    }

private:
    LPCWSTR type;
    LPWSTR name;
    LPVOID lpData;
    DWORD dwSize;
};

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?