-2

私は完全なバイナリ検索ツリーを作成する3つのクラスを持っています。 3つのクラスは です。1. DBentry(名前、IPアドレス、およびステータスを格納します)、 2. TreeNode(独自のDBentryおよびその左右のエントリを指します) 3. TreeDB(ルートTreeNodeそして、私は正常に動作していないようfriend ostream& operator<< (ostream& out, const TreeDB& rhs); friend ostream& operator <<(ostream& out, TreeNode* rhs); これらのオーバーロード演算子を持って、私はfriend ostream& operator <<(ostream& out, const DBentry& rhs); インサイドTreeDBを持っている)バイナリ検索ツリー<<演算子オーバーロードが動作しない

内部DBentryを、追加、更新プログラムを削除し、DBentryobjectsを見つけるために、さまざまな機能を提供します。どんな助けでも本当に役に立ちます。

クラス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); 
}; 

クラスのTreeNode:

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); 


}; 

クラスTreeDBが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を設定できます。どうすれば修正できますか? –

関連する問題