有一个成员函数,我想删除当前对象并在其位置创建一个新数组。这怎么可能?以下代码是我的尝试,它有很多错误。
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
。
答案 0 :(得分:2)
当您在树中拆分节点时,通常从一个节点开始,该节点包含指向其子节点的指针向量。然后,您将创建一个新节点,其中包含指向其子节点的指针向量,您可以使用当前节点的一半子指针初始化这些节点。然后,你从当前节点中删除那些指针 - 但你肯定不会破坏它(即使在“赠送”一半数据之后,它仍然保留了你不想丢弃的相当数量)。
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
执行,因此节点将保持原样。在我们确保创建新节点并将其复制到它之后,我们只删除了额外的指针。
答案 1 :(得分:1)
也许您需要一个使用节点成员初始化的虚拟节点,然后它可以正确处理拆分功能:
Class Node {
public:
Node() {
obj = new Obj();
issplit = false;
}
~Node() {
if (issplit) delete [] obj; else delete obj;
}
void split(int p) {
if (!issplit) {
delete obj;
obj = new Obj[p];
}
}
private:
Obj* obj;
bool issplit;
}