0

単純な二分探索木クラス宣言:

#include <vector>
#include <stdio.h>

// Provides various structures utilized by search algorithms.

// Represents an generalized node with integer value and a set of children.
class Node {
protected:
    std::vector<Node*> children;
    int value;
public:
    //Creates a new instance of a Node with a default value=-1.
    Node(){value = -1;}
    //Creates a new instance of a Node with a specified value.
    explicit Node(int value){this->value = value;}
    virtual ~Node(){delete children;}

    //Adds new Node with specified value to the list of child nodes. Multiple
    //children with the same value are allowed.
    //Returns added node.
    virtual Node* Insert(int value);
    //Removes first occurrence of a Node with specified value among children.
    virtual void Remove(int value);
};

// Represents a binary search tree node with at most two children.
class BTNode: public Node {
public:
    //Creates a new instance of a BTNode with a default value=-1.
    BTNode():Node(){}
    //Creates a new instance of a BTNode with a specified value.
    explicit BTNode(int value):Node(value){}

    //Adds new BTNode with specified value to the list of child nodes in an
    //ordered manner, that is right child value is >= value of this node and
    //left child value < value of this node.
    virtual BTNode* Insert(int value);
    //Removes first occurrence of a Node with specified value from the tree.
    virtual void Remove(int value);
    //Returns a node with specified value.
    virtual BTNode* Search(int value);
};

そして、日食はその定義について不平を言います:

BTNode* BTNode::Search(int value){
    if (this->value == value) return *this;

    //Determines whether value is in left(0) or right(1) child.
    int child = this->value > value ? 0 : 1;
    if (children[child] != NULL)
        return children[child]->Search(value);

    return NULL;
}

children[child]->Search(value)「メソッド検索を解決できませんでした」というメッセージで呼び出しが行われる正確な場所。ビルドは問題なく実行されます (コンパイル エラーは一切発生しません)。それの何が問題なの?

PS:まだコードを実行しようとしていません。それに取り組んでいます。

4

1 に答える 1

2

Searchはインターフェースの一部ですが、 s インターフェースのBTNode一部ではなく、の であるため、を呼び出すことはできません。メソッドを持つことが理にかなっている場合は、メソッドを追加するとその問題が修正されます。そうでない場合は、設計を再考する必要があり、それはおそらくこの質問の範囲を超えています。NodechildrenvectorNode*SearchNode *NodeSearchNode

他にもいくつかの問題があります。あなたが持っている:

virtual ~Node(){delete children;}

しかし、それはchildrenありません。を繰り返し処理し、各要素を呼び出す必要があります。あなたにはこれがあります:pointerstd::vector<Node*>vectordeleteSearch

if (this->value == value) return *this;

Search返されるBTNode*ので、次のようになります。

if (this->value == value)  return this ;
于 2013-04-12T13:26:06.187 に答える