指向节点的指针不更新节点属性
Pointer to Node doesn't update Node properties
我有一个 BinaryTreeNode class,其中有两个 children 左节点和右节点。
我想实例化一个节点N,给它两个childrenL和R,然后更新那些children的属性,这样那些属性当我稍后通过 N 访问它们时会反映出来:N.getLeft().getName() 应该与 L.getName().
相同
我拥有的是 L 和 R 正确更新,但是当通过 N 访问时,它们不是。
我做错了什么?
这是 class 声明:
#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;
}
左派和右派是怎么发起的?也许setLeft和setRight将地址存储到参数的临时内存中?如果没有 BinaryTreeNode
方法的实现,很难说。
setLeft()
和 setRight()
都按值获取节点。这会断开主节点和父节点内节点的所有连接。
你有一堆乱七八糟的指针和按值复制:
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);
这样,当您编辑节点时,它们将被更改。
否则您只需创建新实例。
你有
N.setLeft(L);
这是将左节点设置为尚未实例化的 'L' 的值(不是 'L' 的地址)。然后,您通过执行以下操作将 'L' 的名称设置为其地址:
Lptr->setName("L");
因此,当您访问 N.getLeft() 时,您正在访问未初始化的内存,因此执行 N.getLeft().getName() 基本上是未定义的,您可能会遇到垃圾。
将代码更改为 N.setLeft(&L);
我有一个 BinaryTreeNode class,其中有两个 children 左节点和右节点。
我想实例化一个节点N,给它两个childrenL和R,然后更新那些children的属性,这样那些属性当我稍后通过 N 访问它们时会反映出来:N.getLeft().getName() 应该与 L.getName().
相同我拥有的是 L 和 R 正确更新,但是当通过 N 访问时,它们不是。
我做错了什么?
这是 class 声明:
#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;
}
左派和右派是怎么发起的?也许setLeft和setRight将地址存储到参数的临时内存中?如果没有 BinaryTreeNode
方法的实现,很难说。
setLeft()
和 setRight()
都按值获取节点。这会断开主节点和父节点内节点的所有连接。
你有一堆乱七八糟的指针和按值复制:
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);
这样,当您编辑节点时,它们将被更改。 否则您只需创建新实例。
你有
N.setLeft(L);
这是将左节点设置为尚未实例化的 'L' 的值(不是 'L' 的地址)。然后,您通过执行以下操作将 'L' 的名称设置为其地址:
Lptr->setName("L");
因此,当您访问 N.getLeft() 时,您正在访问未初始化的内存,因此执行 N.getLeft().getName() 基本上是未定义的,您可能会遇到垃圾。
将代码更改为 N.setLeft(&L);