如何在二叉树 class 中正确重载运算符 << ?
How to overloard correctly the operator << , in a binary tree class?
我一直想做一个二叉树,所以我在这里做实验,我碰到了一个墙,更具体地说,输出 带有 运算符 << 的二叉树。目前它所做的是,打印我假设的那个值的 reference,并且如果我尝试将 obj 更改为 *obj,我会出错。(我知道这样,当前程序将仅输出根值).
额外问题:如何使 writeStuff() 函数正确输出整棵树?
我的代码:
#include <iostream>
#include <vector>
class binFa
{
char value;
binFa *righElem;
binFa *leftElem;
public:
binFa(char elem) : value(elem)
{
rightElem = NULL;
leftElem = NULL;
}
binFa(const binFa &fa)
{
value = fa.value;
rightElem = new binFa(fa.rightElem->value);
leftElem = new binFa(fa.leftElem->value);
}
binFa &operator<<(char elem)
{
if (elem == '0')
leftElem = new binFa(elem);
else
rightElem = new binFa(elem);
return *this;
}
void writeStuff(binFa *fa)
{
std::cout << fa->value << " ";
if (fa->rightElem != NULL || fa->leftElem != NULL)
{
writeStuff(fa->leftElem);
writeStuff(fa->rightElem);
}
}
std::ostream &operator<<(std::ostream &os)
{
os << this->value;
return os;
}
};
int main()
{
binFa *obj = new binFa('/');
*obj << '0' << '1' << '0';
std::cout << obj;
obj->writeStuff(obj);
delete obj;
return 0;
}
问题 1
binFa *righElem;
一个愚蠢的错字。
binFa *rightElem;
看起来不错。
问题 2
std::cout << obj;
obj
是指针,当然打印出来的是地址。不要使用指针。这里不需要动态分配。
int main()
{
binFa obj('/');
obj << '0' << '1' << '0';
std::cout << obj;
// obj.writeStuff(&obj); ignoring. One question at a time, please
return 0;
}
问题 3
std::ostream &operator<<(std::ostream &os)
不是有效的流运算符。 What are the basic rules and idioms for operator overloading? 涵盖得很好所以没有必要重复它
问题 4
人们会期望 std::cout << obj;
打印出整棵树,所以
friend std::ostream &operator<<(std::ostream &os,
const binFa & bin)
{
os << bin.value;
return os;
}
可能不会剪掉它。你想要什么样的遍历?对树遍历算法进行一些研究。一个简单的方法:
friend std::ostream &operator<<(std::ostream &os,
const binFa & bin)
{
os << bin.value;
if (bin.rightElem)
{
os << *bin.rightElem;
}
if (bin.leftElem)
{
os << *bin.leftElem;
}
return os;
}
但你需要弄清楚哪种遍历方式适合你。警告:以上是递归的,可能会溢出大树的堆栈。
我一直想做一个二叉树,所以我在这里做实验,我碰到了一个墙,更具体地说,输出 带有 运算符 << 的二叉树。目前它所做的是,打印我假设的那个值的 reference,并且如果我尝试将 obj 更改为 *obj,我会出错。(我知道这样,当前程序将仅输出根值).
额外问题:如何使 writeStuff() 函数正确输出整棵树?
我的代码:
#include <iostream>
#include <vector>
class binFa
{
char value;
binFa *righElem;
binFa *leftElem;
public:
binFa(char elem) : value(elem)
{
rightElem = NULL;
leftElem = NULL;
}
binFa(const binFa &fa)
{
value = fa.value;
rightElem = new binFa(fa.rightElem->value);
leftElem = new binFa(fa.leftElem->value);
}
binFa &operator<<(char elem)
{
if (elem == '0')
leftElem = new binFa(elem);
else
rightElem = new binFa(elem);
return *this;
}
void writeStuff(binFa *fa)
{
std::cout << fa->value << " ";
if (fa->rightElem != NULL || fa->leftElem != NULL)
{
writeStuff(fa->leftElem);
writeStuff(fa->rightElem);
}
}
std::ostream &operator<<(std::ostream &os)
{
os << this->value;
return os;
}
};
int main()
{
binFa *obj = new binFa('/');
*obj << '0' << '1' << '0';
std::cout << obj;
obj->writeStuff(obj);
delete obj;
return 0;
}
问题 1
binFa *righElem;
一个愚蠢的错字。
binFa *rightElem;
看起来不错。
问题 2
std::cout << obj;
obj
是指针,当然打印出来的是地址。不要使用指针。这里不需要动态分配。
int main()
{
binFa obj('/');
obj << '0' << '1' << '0';
std::cout << obj;
// obj.writeStuff(&obj); ignoring. One question at a time, please
return 0;
}
问题 3
std::ostream &operator<<(std::ostream &os)
不是有效的流运算符。 What are the basic rules and idioms for operator overloading? 涵盖得很好所以没有必要重复它
问题 4
人们会期望 std::cout << obj;
打印出整棵树,所以
friend std::ostream &operator<<(std::ostream &os,
const binFa & bin)
{
os << bin.value;
return os;
}
可能不会剪掉它。你想要什么样的遍历?对树遍历算法进行一些研究。一个简单的方法:
friend std::ostream &operator<<(std::ostream &os,
const binFa & bin)
{
os << bin.value;
if (bin.rightElem)
{
os << *bin.rightElem;
}
if (bin.leftElem)
{
os << *bin.leftElem;
}
return os;
}
但你需要弄清楚哪种遍历方式适合你。警告:以上是递归的,可能会溢出大树的堆栈。