2009-06-14 14 views
0

クラス内の1つのプライベートメソッドへの未定義のリファレンスを取得しています。ここにコードの短い断片があります(しかし、現在のところ、すべてが1つのソースファイルにあり、ヘッダーファイルとソースファイルに分かれていません)。同じファイル内で未定義の参照

#include <iostream> 

using namespace std; 

struct node 
{ 
    int key_value; 
    node *left; 
    node *right; 
}; 

class btree 
{ 
    node *root; 
    btree(); 
    ~btree(); 
    void destroy_tree(node *leaf); 

    public: 
    void destroy_tree(); 
}; 

btree::btree() 
{ 
    root = NULL; 
} 

btree::~btree() 
{ 
    destroy_tree(); 
} 

void btree::destroy_tree() 
{ 
    destroy_tree(root); 
} 

void destroy_tree(node *leaf) 
{ 
    if(leaf!=NULL) 
    { 
    destroy_tree(leaf->left); 
    destroy_tree(leaf->right); 
    delete leaf; 
    } 
} 

int main() 
{ 
    return 0; 
} 

コンパイラの出力この行のための `のbtree :: destroy_tree(ノード*)」に、「未定義の参照:

destroy_tree(root); 

しかし、すぐに右のそれを下回るその関数の定義ではありません

答えて

4

あなたdestroy_tree過負荷がBTREEするスコープされていない実装はBTREEが不足している::、それがクラス定義の内部ではないので必要です。

void btree::destroy_tree(node * leaf) 
{ 
    if(leaf!=NULL) 
    { 
    destroy_tree(leaf->left); 
    destroy_tree(leaf->right); 
    delete leaf; 
    } 
} 
1

私が見ることができる主な問題は、ということです。

void destroy_tree(node *leaf) 

は次のようになります。

void btree::destroy_tree(node *leaf) 

またBTREEオブジェクトを作成する方法はありません。おそらくこれを行うべきです:

class btree 
{ 
public: 
    btree(); 
    ~btree(); 

    void destroy_tree(); 

private: 
    void destroy_tree(node *leaf); 
    node *root; 
};