指向节点的指针不更新节点属性

Pointer to Node doesn't update Node properties

本文关键字:节点 更新 属性 指针      更新时间:2023-10-16

我有一个BinaryTreeNode类,它有两个孩子Left和Right。

我想实例化一个节点N,给它两个子节点L和R,然后更新这些子节点的属性,这样当我稍后通过N访问它们时,这些属性就会得到反映:N.getLeft().getName()应该与L.getName()相同。

相反,我得到的是L和R的正确更新,但当通过N访问时,它们并没有。

我做错了什么?

这是类声明:

#include <iostream>
#include <string>
class BinaryTreeNode
{
public:
    BinaryTreeNode();
    BinaryTreeNode(std::string newName);
    BinaryTreeNode(std::string newName, BinaryTreeNode Left, BinaryTreeNode Right);
    ~BinaryTreeNode();
    BinaryTreeNode getLeft();
    BinaryTreeNode getRight();
    int getValue();
    std::string getName();
    void setLeft(BinaryTreeNode newLeft);
    void setRight(BinaryTreeNode newRight);
    void setValue(int newValue);
    void setName(std::string newName);
private:
    int value;
    std::string name;
    BinaryTreeNode* Left;
    BinaryTreeNode* Right;
};

和主要:

#include "tree.h"
int main( int argc, char** argv ) {
    BinaryTreeNode N("N"), L, R;
    BinaryTreeNode *Lptr, *Rptr;
    Lptr = &L;
    Rptr = &R;
    N.setValue(45);
    N.setLeft(L);
    N.setRight(R);
    Lptr->setName("L");
    Rptr->setName("r");
    Lptr->setValue(34);
    std::cout << "Name of N:" << N.getName() << std::endl; //N
    std::cout << "Name of L:" << L.getName() << std::endl; //L
    std::cout << "Name of R:" << R.getName() << std::endl; //r
    std::cout << "value of N: " << N.getValue() << std::endl; //45
    std::cout << "name of N left: " << N.getLeft().getName() << std::endl; //nothing, instead of "L"
    std::cout << "name of L: " << L.getName() << std::endl; //L
    std::cout << "value of N left: " << N.getLeft().getValue() << std::endl; //0, instead of 34
    std::cout << "value of L: " << L.getValue() << std::endl; //34
return 0;

}

您有一堆指针和按值复制:

N.setValue(45);
N.setLeft(L); //This create a New instance of L, copies  the original by value, and then sets it as the left node, eg, its a new node
N.setRight(R); // The same

在这种情况下,您应该传递指针:

void setLeft(BinaryTreeNode * newLeft);
void setRight(BinaryTreeNode * newRight);

这样,当您编辑节点时,它们将被更改。否则,您只需创建新实例。

如何启动"左"answers"右"?也许setLeft和setRight将地址存储到参数的临时内存中?但是很难说没有BinaryTreeNode方法的实现。

setLeft()setRight()都按值获取节点。这会断开主节点和父节点内部节点之间的任何连接。

您有

N.setLeft(L);

这是将左节点设置为尚未实例化的值"L"(而不是"L"的地址)。然后,您可以通过以下操作将"L"的名称设置为其地址:

Lptr->setName("L");

因此,当您访问N.getLeft()时,您正在访问未初始化的内存,因此执行N.getLeft()。getName()基本上是未定义的,您可能会收到垃圾。

将代码更改为N.setLeft(&L);