gpt4 book ai didi

c++ - 如何从派生类访问派生基成员?(在 C++ 中)

转载 作者:行者123 更新时间:2023-11-28 06:18:44 25 4
gpt4 key购买 nike

基类是 NodeAvLNode 是从它派生的。

AVLNode 中,当 this->Left()->Height()Balancefactor() 调用时,Left()Node 的 left* 没有高度被调用。它以段错误结束。

基类:

// A generic tree node class
template<class NodeType>
class Node {
string key;
NodeType* left;
NodeType* right;
NodeType* parent;
public:
Node() { key="-1"; left=NULL; right=NULL; parent = NULL;};
Node(NodeType* source) { //Copy Constructor
key=source->Key();left=source->Left();right=source->Right();parent=source->Parent();
};
void setKey(string aKey) { key = aKey; };
void setLeft(NodeType* aLeft) { left = aLeft; };
void setRight(NodeType* aRight) { right = aRight; };
void setParent(NodeType* aParent) { parent = aParent; };
string Key() { return key; };
NodeType* Left() { return left; };
NodeType* Right() { return right; };
NodeType* Parent() { return parent; };
void copyData(NodeType* source){key=source->key;};
};

派生类:

class AvlNode : public Node<AvlNode>
{
int height;
public:
AvlNode(){height=1;};
//~AvlNode();
int Height() { return height; };
int BalanceFactor(){
return this->AvlNode::Left()->Height() - this->AvlNode::Right()->Height();
};
int setHeight(int aHeight){height=aHeight;};
};

最佳答案

当您创建一个 AvlNode 时,其构造函数默认初始化其基 Node。所以 leftright 指针都是空的。

当然,稍后您可以使用 setLeft()setRight() 更改它,但不能保证您会这样做。同样在树结构中,你总是有没有左边也没有右边的叶子。并不是所有的节点都有左节点和右节点。

因此对于可靠的代码,您必须考虑到 Left()Right() 为 null 的可能性:

int BalanceFactor()
{
int hl=0, hr=0; // value of height if no child

if (Left())
hl = Left()->Height(); // only dereference the pointer if not null
if (Right())
hr = Right()->Height();

return hl-hr;
};

与您的问题无关的非常重要的评论:

您在 github 上的评论中提供的代码库包含重要错误:

  • addNode() 中,您并不总是返回一个值:这可能会导致返回随机节点指针,从而导致内存损坏。当您递归调用 addNode(...) 时,您实际上应该 return (addNode(...)))
  • Tree::min()Tree::max()Tree::findNode() 中也有同样的错误电话。
  • 最后 Tree::Successor() 如果 if 条件都不为真,即如果 thisKey 为 null,则不会返回任何东西。我在此函数的末尾添加了 return thisKey;

只有在纠正了所有这些错误之后,我才能在没有段错误的情况下运行代码。这是 bst.cpp and avl.cpp 的运行摘录,我不得不改变线上的感叹号轿跑车。

关于c++ - 如何从派生类访问派生基成员?(在 C++ 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29723391/

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