2012-04-30 4 views
0

を構造体へのポインタ:C++:コードのその部分を考慮すると、構造体の定義の質問に

struct myStruct 
{ 
    myStruct *next; 
}; 

次は、構造体のポインタであるが、右、構造体の定義で宣言されましたか?

次のようなユーティリティは何ですか?どうすれば使えますか?

+2

これは単独でリンクされたリストのようです。 –

+2

あなたの質問にC++としてタグを付けたので、私は教育的な目的を除いてあなた自身が(単独で)リンクリストを作成する必要はないと主張したいと思います。 'std :: list'クラスのテンプレートを使ってポインタをジャグリングするという厄介な作業を行うことができます。ペイロードをテンプレートにモデリングするのに適した型を渡すだけです。 –

+1

しかし、彼はおそらく学生であり、データ構造を学ぶ必要があります。標準ライブラリを使用してデータ構造を学習するのではなく、教育目的で記述します。 プロダクションコードでは、そうではない非常に良い理由がない限り、標準ライブラリを使用していることがわかります。 – CashCow

答えて

4

リンクリストの実装のようです。

+1

実際の実装ではなく、データ構造です。 –

1

このポインタのユーティリティは、myStructに実装されています。このポインタを使用して(ポインタを介して)他のmyStruct構造体と直接関係を保ち、それらを直接操作することができます(つまり、他のオブジェクトについて「知っている」のように)。例えば

(すべての意図や目的のために、C++でのstructのは、パブリッククラスであることに注意)、

class Test 
{ 
public: 
    doSomethingToTheOtherStruct() { 
    if(t != NULL) 
     t->touch(); 

    setTouched(bool touch) { 
    touched = touch; 
    } 

    setT(Test* other) { 
    t = other; 
    } 

    bool isTouched() const { 
    return touched; 
    } 

private: 
    Test* t; 
    bool touched; 
}; 

このクラスは、ポインタを使用してのパワーを発揮することができますいくつかの非常に簡単な方法があります。次に、それを使用する例を以下に示します。

#include <iostream> 
using namespace std; 
int main() 
{ 
    Test t1; 
    Test t2; 
    Test* t3 = new Test; 

    // Notice that we set the pointers of each struct to point to a different one 
    // This is not necessary, but is definitely more useful than setting it to itself 
    // since you already have the "this" pointer in a class. 
    t1->setT(&t2); 
    t2->setT(t3); 
    t3->setT(&t1); 

    cout<< t1.isTouched() << t2.isTouched() << t3->isTouched() << endl; 

    t1->doSomethingToTheOtherStruct(); 
    t2.doSomethingToTheOtherStruct(); 

    cout<< t1.isTouched() << t2.isTouched() << t3->isTouched() << endl; 

    delete t3; 

    return 0; 
} 

このコードの結果に注意してください。 t1は決してタッチされるようには設定されていませんが、誤って(ポインタを使用して)t2t3が「タッチ」になります。

2

このような構造体を連鎖して後で通過させたい場合は、nextを使用できます。もちろん、myStruct内に他のメンバーを持つ方が理にかなっています。

例:正しい

struct myStruct 
{ 
    int  data; 
    myStruct *next; 
}; 

myStruct st_1; 
myStruct st_2; 

st_1.data = 1; 
st_2.data = 2; 

st_1.next = &st_2; //st_1.next->data is now 2 
0

。この種のネストされた構造体は、linked listsで使用されます。

1

同じクラスへのポインタであり、メンバー変数が「次」と呼ばれるという事実は、他の人が指摘しているように、リンクされたリストであることを示しています。

変数が同じクラスへのポインタであっても "親"と呼ばれていた場合、親子関係の可能性が高いです。 (たとえば、ウィジェットでもある親を持つGUIウィジェットなど)。

あなたはこれを行うことが許可されている理由です:データ型へのポインタがすべて同じサイズなので、コンパイラはこのポインタに必要なバイト数をすでに知っています。

同じ理由で、データ型が宣言されていて定義されていない型へのポインタをクラス(または構造体)に持つことができます。 (かなり一般的です)。

関連する問題