6

私のクラスに は、ノードの 1 つに簡単にインデックスを付けることができるように、添字演算子をオーバーロードしたいメンバー変数std::vector<node*>childrenがあります。


その関数のクラスの減速は次のとおりです。

node* operator[](int index);  

その関数のクラス定義は次のとおりです。

node* class_name::operator[](int index){

    return children[index];
}  

ただし、この関数は期待どおりにポインターを返さないようです。
これが私に問題を引き起こしている機能です:

void Print_Tree(node* nptr, unsigned int & depth){

    if (NULL == nptr) {
        return;
    }
      //node display code

    for (int i = 0; i < nptr->Number_Of_Children(); ++i){
        Print_Tree(nptr[i],depth+1); //<- Problem Here!
    }
     //node display code

    return;
}  

私が得るエラーは次のとおりです。

エラー: 再帰呼び出しで 'node' を 'node*' に変換できません

ノードへのポインターが必要なときにノードが返される理由がわかりません。
オーバーロードされた関数に何か問題がありますか?
再帰呼び出しでノードを逆参照してみました:

Print_Tree(*nptr[i],depth+1);  
Print_Tree(*(nptr[i]),depth+1);
Print_Tree(nptr->[i],depth+1);

無駄に!

私は何を間違っていますか?

4

2 に答える 2

8

適切な場所で問題を探していますが、3 回の修正試行の構文はまだ少し間違っています。

nptrはオブジェクトへのポインターであるNodeため、インデックス演算子を直接適用することはできません (適用した場合、コンパイラーはそれがNode配列の先頭を指していると想定し、i 番目のエントリにジャンプします)。

代わりに、まずポインターを逆参照してから、インデックス演算子を適用する必要があります。括弧を使用して、この順序を決定します。

Print_Tree((*nptr)[i],depth+1);

別の注意intとして、ベクトルへのインデックスのデータ型として使用するのは少し間違っています。std::size_tまたはを使用することをお勧めしますstd::vector<Node*>::size_type


さらに、この質問がnullptrとタグ付けされていることを考えると、null ポインターを参照する正しい方法はではなくであることを指摘する必要がありますNULL

于 2012-09-16T07:31:07.073 に答える
1

operator[]ポインターを返すことは確かに合法ですが、代わりに参照を返す方がより良い設計です (そして標準クラスからの期待に適合します)。次に、その参照のアドレスを次のように取得できます。

node& class_name::operator[](int index){
    return *(children[index]);
}

そしてそれを次のように使用します:

Print_Tree(&(*nptr)[i],depth+1);
于 2012-09-17T01:25:12.693 に答える