gpt4 book ai didi

c++ - 使变量不可复制的紧凑方法

转载 作者:行者123 更新时间:2023-11-30 00:43:50 25 4
gpt4 key购买 nike

我的代码中有几个类,我需要从中复制对象。

但是,其中一些类使用了我想在复制时跳过的数据,例如所有者指针。

到目前为止,我发现这样做的唯一方法是避免完全复制并在每次需要复制对象时手动构造一个全新的对象,或者将所有者指针包装在一个私有(private)的、不可复制的结构中,像这样:

class MyClass {
// non-copyable owner
struct Owner {
Owner() = default;
~Owner() = default;

Owner(const Owner& o) = delete;
Owner& operator=(const Owner& o) = delete;

SomeOtherClass* pointer = nullptr;
};

Owner owner = Owner();
}

但是,这样做似乎有点冗长。

(请注意,我不想使用 std::unique_ptr,因为我不想在解构对象时解构所有者)

是否有更紧凑/更高效/可读性更强的方法?

编辑:default 标记的构造函数等的失效源于我没有使用默认值初始化所有者。傻。

编辑 2:也许我应该澄清一些事情:所有者指针应该指向拥有 MyClass 的对象,作为拥有对象引用其所有者的一种方式。不是相反。这就是为什么我不希望复制指针,因为具有不同所有者的对象应该复制该对象不应该更改它所拥有的对象。

接受的答案使我能够做到这一点。我希望这消除了一些困惑。

最佳答案

您可以将 std::unique_ptr 与不执行任何操作的删除器一起使用。

template<typename T>
struct nop_deleter<T> {void operator()(T*){};};

class MyClass {
std::unique_ptr<SomeType, nop_deleter<SomeType>> owner;
};

“拥有的”对象将不会被解构。 (此时它不再是真正的拥有,但这只是我的迂腐)。

如果你想让它更具可读性,你总是可以给类型起别名:

template<typename T>
struct nop_deleter<T> {void operator()(T*){};};

template<typename T>
using Owner = std::unique_ptr<T, nop_deleter<T>>;

class MyClass {
Owner<SomeType> owner;
};

关于c++ - 使变量不可复制的紧凑方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52213232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com