2016-04-04 13 views
0

を使用します。メインに今ネストされた構造 - 初期化し、だから私は、ヘッダファイル持って

struct inner1 { 
     int w; 
     int x; 
}; 

    struct inner2 { 
     int y; 
     int z; 
}; 
struct outer{ 
     inner1 *a; 
     inner2 *b; 
}; 

を、私はこれらの構造を初期化し、それらを使用します。 3つの構造体をすべて初期化して、outerがinner1とinner2をそれが指す特定の構造体として認識するようにするにはどうすればよいですか?次に、変数wにアクセスしたいとします。それは外側ですか? - > w?私はポインタを扱うネストされた構造に慣れていません。どんな助けもありがとうございます。

+2

本当にポインタが必要ですか? のように宣言できますか?inner1 a; inner2 b; ' 「o.a.w」のように使用しますか? – Ceros

+0

これはCかC++ですか? – blazs

+0

私は非常に大規模なこの概念を使用するプログラムで働いています!それは、デバッグする痛みや、壊れたときに痛みがあるので、どこにでもメモリを割り当てたり、割り当てを解除することができます。もしあなたがそれを使用しているなら、ドキュメントを作成してください。 –

答えて

0

あなたは両方の前提で正しいです。

これらの3つの構造がこの順序で定義されている限り、それ以上の宣言は必要ありません。

1
struct inner1 { 
     int w; 
     int x; 
}; 

    struct inner2 { 
     int y; 
     int z; 
}; 
struct outer{ 
     inner1 *a; 
     inner2 *b; 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    outer o; 
    o.a = new inner1(); 
    o.b = new inner2(); 
    o.a->w = 1; 
    o.a->x = 2; 
    o.b->y = 3; 
    o.b->z = 4; 

//ものを行う

delete o.a; 
    delete o.b; 

    return 0; 
} 

これは、構造体を宣言して初期化することを許可します。ここで

+2

これはaとbが初期化されていないのでクラッシュします。 – Ceros

+0

@Ceros私は同じと思っていましたが、私の驚きにはそれはありません。私はまだ未定義の行動だと思う。 'a'と' b'はちょうどポインタであり、まだメモリが割り当てられている必要があります。 – user463035818

+0

正確に定義されていない動作。私はデフォルトではnullptrに割り当てられているとは思わない – Ceros

1

は実証プログラム

#include <iostream> 

int main() 
{ 
    struct inner1 { 
     int w; 
     int x; 
    }; 

    struct inner2 { 
     int y; 
     int z; 
    }; 

    struct outer{ 
     inner1 *a; 
     inner2 *b; 
    }; 

    outer o = { new inner1 { 10, 20 }, new inner2 { 30, 40 } }; 

    std::cout << "o.a->w = " << o.a->w << ", o.a->x = " << o.a->x 
       << ", o.b->y = " << o.b->y << ", o.b->z = " << o.b->z 
       << std::endl; 

    delete o.a; 
    delete o.b; 
} 

は、プログラム出力が

o.a->w = 10, o.a->x = 20, o.b->y = 30, o.b->z = 40 

であるか、あなたは次のよう

#include <iostream> 

int main() 
{ 
    struct inner1 { 
     int w; 
     int x; 
    }; 

    struct inner2 { 
     int y; 
     int z; 
    }; 

    struct outer{ 
     inner1 *a; 
     inner2 *b; 
    }; 

    inner1 i1 = { 10, 20 }; 
    inner2 i2 = { 30, 40 }; 

    outer o = { &i1, &i2 }; 

    std::cout << "o.a->w = " << o.a->w << ", o.a->x = " << o.a->x 
       << ", o.b->y = " << o.b->y << ", o.b->z = " << o.b->z 
       << std::endl; 

}  

を行うことができたアプローチは、タスクに依存しての使用でありますオブジェクト。

+0

' o'があなたのためにこれを世話したコンストラクタを持っていればそれはもっときれいになるでしょうが、おそらくそれはこのコードの責任ではありません。 – tadman

+0

@tadman質問に表示されたコードを使用しようとしました:)もちろん、例えば、データメンバーのためにスマートポインタをstd :: unique_ptrとして使用することができます。 –

+0

これを改善し、少し騒々しくする方法を提供するだけです。確かに良い答えがあります。 – tadman

0

ようこそC++。

あなたが自分でやることは、早い段階でスマートポインタについて学ぶことです。

構造体を生ポインタで書くのはほとんどの場合間違いです。

#include <memory> 
#include <iostream> 

struct inner1 { 
    inner1(int a, int b) : w(a), x(b) {} 
    int w; 
    int x; 
}; 

struct inner2 { 
    inner2(int a, int b) : y(a), z(b) {} 
    int y; 
    int z; 
}; 

struct outer{ 
    outer(int w, int x, int y, int z) 
    : a(std::make_unique<inner1>(w,x)) 
    , b(std::make_unique<inner2>(y,z)) 
    {} 

    std::unique_ptr<inner1> a; 
    std::unique_ptr<inner2> b; 
}; 

int main() 
{ 
    auto p_outer = std::make_unique<outer>(1, 2, 3, 4); 

    return 0; 

    // p_outer.a and .b are destroyed automatically here 
    // and all memory is reclaimed. 
} 
+0

あなたのアウターは、フィールドが4つしかないときに本当にリアルに見えます。私の実際の構造(そこには4つあります)は20以上のフィールドを持っています。私はあなたが構造のすべてのフィールドを書き換える必要はないはずですか? – minusila

+0

@minusilaコンストラクタ内の完全な構造体のセットを渡すことができない理由はありません。 –

関連する問題