そのコードを考えると:
struct myStruct
{
myStruct *next;
};
次は構造体定義で宣言されている構造体のポインタですよね?
- next - の効用は何ですか? どのように使用できますか?
そのコードを考えると:
struct myStruct
{
myStruct *next;
};
次は構造体定義で宣言されている構造体のポインタですよね?
- next - の効用は何ですか? どのように使用できますか?
リンクリストの実装のようです。
そのような構造を連鎖させて後でトラバースする場合は、 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
このポインタの有用性は、 で実装するものですmyStruct
。myStruct
このポインターを使用して (ポインターを介して)他の構造体との直接的な関係を保持し、それらを直接操作できます (つまり、他のオブジェクトについて「知る」ように)。
たとえば (すべての意図と目的のために、C++ の構造体はパブリック クラスであることに注意してください)、
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
touched に設定されることはありませんが、うっかりして (ポインターを介して)、「touched」になりますt2
。t3
それが同じクラスへのポインターであり、メンバー変数が「next」と呼ばれているという事実は、他の人が指摘しているように、それがリンクされたリストであることを示唆しています。
変数が同じクラスへのポインターであるが「親」と呼ばれる場合、おそらく何らかの親子関係になります。(たとえば、ウィジェットでもある親を持つ GUI ウィジェット)。
あなたが疑問に思うかもしれないのは、なぜこれを行うことが許されているのかということです: 答えは、 data 型へのポインターはすべて同じサイズであるため、コンパイラーはこのポインターに必要なバイト数を既に知っています。
同じ理由で、クラス (または構造体) に、データ型が宣言されているだけで定義されていない型へのポインターを含めることができます。(行うのは非常に一般的です)。
それは正しいです。この種のネストされた構造体は、 連結リストで使用されます。