gpt4 book ai didi

c++ - 删除当前对象并创建一个新对象数组

转载 作者:行者123 更新时间:2023-11-28 01:10:10 24 4
gpt4 key购买 nike

有一个成员函数,我想删除当前对象并在其位置创建一个新对象数组。这怎么可能?下面的代码是我的一次尝试,有很多错误。

void LernaeanHydra::split(int parts)
{
LernaeanHydra *new_heads = new LernaeanHydra[parts];
for (int i = 0; i < parts; i++) {
std::vector<LernaeanHydra *> child123;
for (int j = i * parts; j < (i + 1) * parts; j++) {
child123[j] = children[i * parts + j];
}
new_heads[i] = LernaeanHydra(child123, num_children/parts);
}

delete this;
}

我读到过我们不应该显式调用析构函数,也不应该尝试 delete this

最佳答案

在拆分树中的节点时,通常从一个节点开始,该节点包含指向其子节点的指针 vector 。然后,您将创建一个新节点,其中包含指向其子节点的指针 vector ,您使用当前节点的一半子指针对其进行了初始化。之后,您从当前节点中删除这些指针——但您肯定不会销毁它(即使在“放弃”其一半数据之后,它仍然保留了您不想丢弃的相当数量)。

class Node { 
// for the moment I'm ignoring the keys, though they'd also be needed for any
// of this to accomplish much.
std:vector<Node *> children;
typedef std::vector<Node *>::iterator child_it;
public:
Node(child_it begin, child_it end) : children(begin, end) {}

Node *split() {
size_t center = children.size() / 2;

Node *new_node = new Node(children.begin()+center, children.end());
children.erase(children.begin() + center, children.end());
return new_node;
}
};

请注意,在 C++0x 中,您可能希望移动指针而不是复制然后销毁原始指针(尽管考虑到它们是指针,它可能不会产生任何真正的区别)。

另请注意,这应该是异常安全的——如果分配/初始化新节点失败,throw 将阻止 children.erase 执行,因此节点将保持原样。我们只有在确保创建新节点并将它们复制到新节点成功后才删除额外的指针。

关于c++ - 删除当前对象并创建一个新对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3835422/

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