0

誰かが私にこれを説明できますか:

(((((*(parent))->leaves))[7])->zone_id)

ポインターへのポインターは本当に混乱します。これは、デバッグ モードでウォッチから取得した式です。ツリーの最後の要素内の文字列にアクセスしようとしていますzone_id(10 個の要素があり、各要素は異なる番号 0-9 です)。

編集:これは検索機能全体です。理解するのに十分であることを願っています:

string Tree::search(string str, node** parent, int num) {

    int value;

    if (num < str.length()) {

        value = boost::lexical_cast<int> (str.substr(num, 1));

        if ((*parent)->leaves[value] != NULL  &&  num != str.length() -1) {

            search (str, &((*parent)->leaves[value]), num+1);


        } else if (num == str.length() -1) {

            if ( (*(parent)->leaves)[value]->zone_id.empty() )
                cout<<"Yep.";
            else
                return (string) "No_results.";

        }

    } 


}

と構造:

struct node {

    string zone_id;
    node* leaves [10];

};
4

3 に答える 3

5

いくつかの括弧を削除して、少し単純化しましょう。

(*parent)->leaves[7]->zone_id

これで、はるかに理解しやすくなりました。と呼ばれる配列メンバーを持つオブジェクトへのポインターを提供するparent( ) を逆参照しています。そのため、インデックス 7 を使用してその配列の要素にアクセスします。これにより、別のポインターが得られます。今回は、というメンバーを持つオブジェクトを指しています。次に、そのメンバーにアクセスします。*parentleaveszone_idzone_id

これはすべて、演算子のオーバーロードが含まれていないことを前提としています。

図式的に(矢印は「指している」):

 ________     _________     ___________         ___________
| parent |-->| *parent |-->|  struct:  |   ,-->|  struct:  |
|________|   |_________|   | leaves[0] |   |   | zone_id   |
                           | leaves[1] |   |   | ...       |
                           | leaves[2] |   |
                           | leaves[3] |   |
                           | leaves[4] |   |
                           | leaves[5] |   |
                           | leaves[6] |   |
                           | leaves[7] | --'
                           | leaves[8] |
                           | ...       |
于 2012-12-28T13:58:31.260 に答える
0

私の考えでは、括弧を削除すると、実際に読みやすくなります。 (*parent)->leaves[7]->zone_id

したがって、葉のポインターへのポインターがあります。(*parent)そのポインターへの逆参照を行います (そのため、ポインターが指しているものをフェッチします)。これで葉へのポインターができました。これは 10 個の配列です。要素 7 を使用します。このポインターは、zone_id を取得するために使用されます。

少し複雑になりますが、これは私が見た中で最も複雑な構造とはほど遠いものです。それがあなたを助けるなら、あなたはそれを分解することができます:

Parent *this_parent = *parent;

Leave *leaf = this_parent->leaves[7];

... use leaf->zone_id;
于 2012-12-28T14:00:10.017 に答える
0
(
  (
    (
      (
        (
          *(parent)
        )
        ->leaves
      )
    )
    [7]
  )
  ->zone_id
)
  • 逆参照parent
  • leavesメンバーにアクセスする
  • 7番目の要素にインデックスを付ける
  • zone_idメンバーにアクセスします。
于 2012-12-28T14:01:44.730 に答える