0

最近、C++、つまりクラスとポインターをいじり始めました。同様の質問を探しましたが、何も役に立ちませんでした。

一部の情報を文字列形式 (char *) で保持する二分探索ツリー クラスがありますが、ツリーに新しいノードを追加した後、ジャンクが返されるため、情報を取得できません。

私のコードは次のようになります。

class Node
{
    Node *lNode;
    Node *rNode;
    char *name;
    public:
        void setName(char *n) { name = n; }
        char *getName() { return name; }
}

class Tree
{
    Node *root;
    Node *addNode(Node *, Node *);
    public:
        Tree() { root = NULL };
        int addNewNode(Node *);
        void print();
};

int Tree::addNewNode(Node *n)
{
    root = addNode(root, n);
    cout << root->getName() << endl;   // this returns the name correctly
}

Node *Tree::addNode(Node *subtree, Node *node)
{
    if(subtree== NULL)
    {
        subtree = node;
    }
    else if(node->getName() <= subtree->getLeft())
    {
        subtree->setLeft(addNode(subtree->getLeft(), node));
    }
    else
    {
        subtree->setRight(addNode(subtree->getRight(), node));
    }

    return subtree;
}

void Tree::print()
{
    cout << root->getName() << endl;    // this does not!
}

そして、これは私がメソッドを呼び出す場所です:

Tree *myTree = new Tree();

Node *n = new Node();
n->setName(name);
myTree->addNewNode(n);

ツリー変数は外部コンテナー クラスのプライベート メンバー属性であり、実際にはそのクラスの外部で作成されてコンストラクターに渡されます。addNewNode メソッドを呼び出すと、ノードがツリーに追加されますが、ルートに格納されているノードの名前を出力したい場合、ジャンクが表示されます。どこかにヘイワイヤーポインターがあると思いますが、一生見つけることができません。

どんな助けでも大歓迎です。

4

2 に答える 2

0

root が null の場合、node ではなく city に設定します。問題があります。

于 2013-02-18T18:44:47.480 に答える
0

setName文字列ポインター名を渡して、ポインターをコピーしているだけだと思いますname(文字列を再割り当てして保存するのではなく)。その後、元のオブジェクトはなくなり、オブジェクトnameはガベージを指したままになります。name代わりにstd::string を使用するか、strcpy/memcpy で独自のメモリを作成してみてください。そのルートに行く場合は、オブジェクトの破棄name = new char[ strlen(n) + 1 ]を忘れないでください。delete [] name

于 2013-02-18T18:48:05.583 に答える