c++ - 如何知道对象是否被移动

标签 c++ design-patterns

这可能是一个愚蠢的问题,但我觉得我缺少一些设计模式。

在一个类的销毁过程中,无论它是否被移动,我都想做不同的操作。我想过实现一个简单的 bool 值,在类移动时打勾。

像这样:

class A {
    A(A && a) {
        a.was_moved = true;
    }

~A() {
    do some stuff

    if (!was_moved) {
        clean some more stuff
    }

bool was_moved = false;
};

有没有“更好”的方法来做到这一点?一些 cpp 功能我可以询问类是否被移动或一些已知的设计模式。

最佳答案

没有允许这样做的功能。但通常您不需要知道这一点。

通常,当您定义移动构造函数时,您希望它将基础数据从一个对象“移动”到另一个对象。在您的上下文中,您似乎希望源对象之后为“空”,以便只有一个所有者(毕竟它是“移动”,而不是“复制”)。因此,您真正需要的是“空”对象的正确定义以及处理这种情况的正确方法。

例如,假设您的类与文件描述符相关联。然后你可以让 fd 的默认值等于 -1 并在其上区分析构函数:

#include <utility>

class A
{
    public:
        A(int fd) : fd { fd }
        {
        }

        A(A&& other) : fd { std::exchange(other.fd, -1) }
        {
        }

        ~A()
        {
            if (fd != -1)
            {
                close(fd);
            }
        }

    private:
        int fd = -1;
};

当然,您可以通过附加标志将对象标记为空。事实上,在某些特殊情况下,人们确实会这样做。即使在标准库中。您可能想要 read this .请注意 unique_lock 类上的 __owns_ 标志。

关于c++ - 如何知道对象是否被移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48907892/

相关文章:

c++ - 为什么 `i =++i + 1` 未指定行为?

c++ - 未能看到复合/迭代器设计模式的真正值(value)

c++ - 如何将 std::vector<std::string> 转换为 boost::spirit 中结构的成员?

c++ - 禁用非完全专用模板类的构造

c++ - 如何在没有外部标志的情况下仅在循环内运行一次代码?

ruby - 在Ruby中使用方法名的字符串/变量调用方法

objective-c - Grand Central Dispatch 延迟执行设计模式

java - 如何为大日志文件编写 Java 文本文件查看器

c++ - C++ 库的 C 接口(interface)示例?

c++ - C++ 11中的T &&(双“&”号)是什么意思?