-2

我有3个类创建了一个完整的二叉搜索树。这三个类别是 1. DBentry(存储名称,IP地址和状态), 2. TreeNode(指向它自己的DBentry以及它的左边和右边的条目) 3. TreeDB(包含根树节点并提供各种功能的添加,删除,更新,并找到DBentryobjects)二元搜索树<<运算符重载不起作用

里面DBentry我friend ostream& operator <<(ostream& out, const DBentry& rhs); 里面树形菜单我有friend ostream& operator<< (ostream& out, const TreeDB& rhs); friend ostream& operator <<(ostream& out, TreeNode* rhs); 这些运算符重载似乎并没有正常工作。任何帮助都会非常有帮助。

类DBentry:

class DBentry { 
private: 
string name; 
unsigned int IPaddress; 
    bool active; 

public: 

DBentry(); 
    DBentry (string _name, unsigned int _IPaddress, bool _active); 


~DBentry(); 


void setName(string _name); 


void setIPaddress(unsigned int _IPaddress); 


    void setActive (bool _active); 


string getName() const; 


unsigned int getIPaddress() const; 


    bool getActive() const; 

    friend ostream& operator <<(ostream& out, const DBentry& rhs); 
}; 

类树节点:

class TreeNode { 
private: 
DBentry* entryPtr; 
TreeNode* left; 
TreeNode* right; 

public: 
TreeNode(); 

TreeNode(DBentry* _entryPtr); 


~TreeNode(); 


void setLeft(TreeNode* newLeft); 


void setRight(TreeNode* newRight); 


TreeNode* getLeft(); 


TreeNode* getRight(); 


DBentry* getEntry() const; 

bool find(string _name); 


}; 

类树形菜单具有private: TreeNode* root;

ostream& operator <<(ostream& out, const DBentry& rhs){ 
out<<rhs.name<<" : "<<rhs.IPaddress<<" : ";//<<rhs.active? (out<<"active"):(out<<"inactive")<<endl; 
if(rhs.active) 
    out<<"active"; 
else 
    out<<"inactive"; 
out<<endl; 
} 

ostream& operator <<(ostream& out, TreeNode& rhs){ 
if(rhs.getEntry()!=NULL){ 
    out << *(rhs.getLeft()); 
    out << *(rhs.getEntry()); 
    out << *(rhs.getRight()); 
} 
} 

ostream& operator<< (ostream& out, const TreeDB& rhs){ 
out << *(rhs.root); 
} 

回答

2

ostream& operator <<(ostream& out, TreeNode& rhs)说该函数返回到ostream的参考。该代码不会返回ostream引用,因此程序将继续进入未定义行为的快乐冒险。

在最低限度,并且有可能在程序的未发布的部分以外的问题,必须OP

ostream& operator <<(ostream& out, TreeNode& rhs){ 
    if(rhs.getEntry()!=NULL){ 
     out << *(rhs.getLeft()); 
     out << *(rhs.getEntry()); 
     out << *(rhs.getRight()); 
    } 
    return out; //<-- return the stream. Do not cross streams unless fighting Gozer. 
} 

其他operator<<重载具有相同的缺陷。

+0

即使退出;它给出了分段错误。 –

+0

@FabiaBushraTamanna如果Entry不为NULL,左或右是否可能为NULL?打印NULL将是一个简单的方法来崩溃。 – user4581301

+0

是的,左边或右边可能是NULL。我该如何解决这个问题? –