gpt4 book ai didi

c++ - 保存对其他对象的引用的对象的深层拷贝

转载 作者:搜寻专家 更新时间:2023-10-31 01:55:59 24 4
gpt4 key购买 nike

我有一个“总和”类,它包含两个对现有整数的引用(比方说)。我想创建一个深度复制整数的“复制”方法。我以为我永远不必手动 delete由于智能指针,我的代码中的对象,但我必须在这个解决方案中。此外,它对于如此琐碎的任务来说太复杂了(我需要在几节课中重复)。有更直接的解决方案吗?

注意:我不想为每个对象添加一个 bool 成员(标志)以确定是否必须删除整数(在我的例子中,它并不比析构函数中的 std::set 检查开销更好)

#include <set>

struct sum {
const int &a, &b;
static std::set<const int*> allocated_ints;

sum(const int& a, const int&b): a(a), b(b) {}

sum copy() const {
sum res(*new const int(a), *new const int(b));
allocated_ints.insert(&res.a);
allocated_ints.insert(&res.b);
return res;
}

~sum() {
if (allocated_ints.count(&this->a)) {
delete &this->a;
delete &this->b;
allocated_ints.erase(&this->a);
allocated_ints.erase(&this->b);
}
}

};

std::set<const int*> sum::allocated_ints;

最佳答案

常量 的“深层”拷贝有什么意义?无论如何,常量都将具有相同的值!所以只需复制(即别名)const-references:

struct Foo
{
const int & n;

Foo(const int & m) : n(m) { }
Foo(const Foo & rhs) : n(rhs.n) { }

Foo copy() const { Foo f(*this); /* ... */ return f; }
// ...
};

如果您担心从引用局部变量的函数返回拷贝时会出现悬挂引用,那么不要让类具有常量引用,而要使拷贝具有常量引用。这样一来,您自然会为您的类(class)提供您似乎无论如何都想要的复制语义。

如果您认为可以根据您的使用方式制作一个非拥有或成为拥有的混合体,那么我认为您应该避免这种糟糕的设计。确定您的类(class)是否拥有数据的所有权,然后顺其自然。

关于c++ - 保存对其他对象的引用的对象的深层拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7796944/

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