2011-12-21 3 views
1

私はバイナリ検索ツリーと対応するインデックスを作成する必要があるコンピュータサイエンスクラスのプロジェクトに取り組んでいました。このプロジェクトでは再帰を使用する必要がありました。ここでメンバー関数が自分のオブジェクトデータメンバーを変更しないのはなぜですか?

は私のクラスの実装です:

class Leaf; 
struct indexEntries; 
class BinarySearchTree{ 
    public: 
     BinarySearchTree(); 
     ~BinarySearchTree(); 

     //Helper Functions for recursive calls 
     std::string search(std::string); 
     void BuildTree(std::string); 
     void inOrderPrint(); 

    private: 
     //Recursive Functions 
     void BuildTreeR(int start, int end, Leaf * r); 
     void inOrderPrint(Leaf * start); 
     Leaf * search(std::string inquiry, Leaf * start); 
     void DeallocateTree(Leaf * start); 

     //Data members 
     Leaf * root; 
     std::vector<indexEntries> BSTindex;  
}; 


class Leaf{ 
    public: 
     Leaf(){ 
      indexID = ""; 
      AccNum = ""; 
      left = NULL; 
      right = NULL; 
     }; 
     void set_index(std::string input)  {indexID = input;}; 
     void set_AccNum(std::string input)  {AccNum = input;}; 
     void set_left(Leaf* newLeft) {left = newLeft;}; 
     void set_right(Leaf* newRight) {right = newRight;}; 
     std::string get_index() {return indexID;}; 
     std::string get_AccNum() {return AccNum;}; 
     Leaf * get_left() {return left;}; 
     Leaf * get_right() {return right;}; 

    private: 
     std::string indexID; 
     std::string AccNum; 
     Leaf * left; 
     Leaf * right; 
}; 

そして私は根がそのまま行くために指している機能ボイドBinarySearchTree::BuildTreeR(int, int, Leaf*)リーフにLeaf * BinarySearchTree::rootを渡すためにしてみてください。

ここ

は私BuildTreeR()関数です:

void BinarySearchTree::BuildTreeR(int start, int end, Leaf * parent){ 
    int mid = (start+end)/2; 
    if(parent == NULL){ 
     parent = new Leaf; 
     parent->set_index((BSTindex[mid]).indexID); 
     std::string fullEntry = BSTindex[mid].dataBaseEntry; 
     parent->set_AccNum(fullEntry.substr(4, 3)); 
    } 

    if((mid-1)>start){ 
     BuildTreeR(start, mid-1, parent->get_left()); 
    } 
    if((mid+1)<end){ 
     BuildTreeR(mid+1, end, parent->get_right()); 
    } 
} 

デバッガを使用して、私は葉が*親が変更されますが、これらの変更はLeaf * BinarySearchTree::rootに引き継がれていない、私を停止するリーフで指されることがわかりましたプログラムは働いています。

デバッガは/それを修正する方法を知っている私は変更しようとしているデータの値が

CXX0030: Error: expression cannot be evaluated 

が、これは前に発生していた誰もが持っていると言っていますか?

答えて

1

問題の分析はまさに正しいことです:ポインタは値によって渡されるので、関数の値はparentになり、呼び出し元には表示されません。問題を解決する

一つの方法は、参照によりparentポインタを渡すことである。

void BinarySearchTree::BuildTreeR(int start, int end, Leaf *& parent){ 

(追加&に注意します)。

このようにして、関数内でparentに加えられた変更は、自動的に呼び出し側に表示されます。

+0

私はその昨夜、プロジェクトが完了する前に試してみました。実装とヘッダーファイルの両方で編集しましたが、変更しようとしていたすべてのデータに対して同じエラーがありました。 – mcnnowak

+0

これをもう一度使ってみようとしましたが、 '' BinarySearchTree :: BuildTreeR ': 'Leaf *'から 'Leaf *'へパラメータ3を変換できません。 – mcnnowak

+0

@mcnnowak:' get_left() 'と' get_right() 'はポインタへの参照(またはポインタへのポインタ)を返します。 – NPE

関連する問題