構造体を持つ構造体の定義時での初期化

解決


kossy  2005-01-16 03:22:56  No: 56018

初めまして。超くだらない質問ですが、困っております。
複数の構造体をメンバに持つ構造体を定義時に初期化しようとしております。
vc6です
仕事でCodeWarriorを良く使うのですが、そちらでは問題御座いません。
-----------------
typedef struct{
 D3DXVECTOR3 sPos;
}_Tes;
------------------
main()
{
 _Tes Pos0 = {  0.0f, 0.0f, 0.0f };
 _Tes Pos1 = {  D3DXVECTOR3(0.0f, 0.0f, 0.0f) };
 _Tes Pos2 = {  {0.0f, 0.0f, 0.0f} };
}
上記どの場合も初期化エラーになってしまいます。
構造体がネストしてなければ通るのですが
D3DXVECTOR3 Pos0 = D3DXVECTOR3(0.f, 0.f, 0.f); ・・・ OK

以上申し訳無いですが宜しくお願い致します。


  2005-01-16 10:06:53  No: 56019

違ってたらごめんなさい

たぶんD3DXVECTOR3がコンストラクタを持ってるからではないですかね?

コンストラクタの無い構造体を内部に持たせた場合は普通に初期化できますし
もっとも仕様とかはあんまり詳しくないんでなぜかはわかりませんが・・・

解決策としては外側の構造体にもコンストラクタを作って、
それで初期化するとか

struct TEST{
  D3DXVECTOR3 sPos;
  TEST(D3DXVECTOR3& dt){sPos = dt;}
};

main()
{
  TEST test(D3DXVECTOR3(0.0f,0.0f,0.0f));
}

みたいな

もし何かずれてること言っちゃってる場合は誰かツッコミお願いします


とおり  2005-01-16 11:24:07  No: 56020

>    TEST(D3DXVECTOR3& dt){sPos = dt;}

これではデフォルトコンストラクタが呼ばれ、期待するメンバ変数の「初期化」は出来ません。
メンバイニシャライザによって、適切なコンストラクタを指定して初期化を行います。

struct TEST {
    D3DXVECTOR3 sPos;
    TEST(D3DXVECTOR3& dt) : sPos(dt) {}
};

ただ、私は上記構造体/クラスの詳細は知らないため、コピーコンストラクタやoperator=()が
どう定義されているかは知りません。(もしかしたら、↑の代入でもOK?)


  2005-01-16 21:52:39  No: 56021

あ、確かにわたしのだと
デフォルトコンストラクタ呼び出し→代入
って流れになっちゃうのかな?

明確に「初期化」を求めるならとおりさんの方法がいいかもしれませんね

参考までにコピーコンストラクタやoperator=()は特に定義されてないみたいです
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/directx9_c/directx/graphics/reference/d3dx/structures/d3dxvector3.asp


kossy  2005-01-17 18:41:15  No: 56022

憂さん、とおりさん有難う御座います。
C++滅多に使わないもので、コンストラクタ気が付きませんでした。
試したところ巧く行きました!
もう一点お伺いしたいのですが、
下記メンバを増やした際に
コンストラクタを持たないDWORDと
コンストラクタを持つD3DXVECTOR2と
の場合の定義はどのようにすれば良いのでしょうか?
こちらも全て初期化する事は出来ますでしょうか?

struct TEST {
D3DXVECTOR3 sPos;
TEST(D3DXVECTOR3& dt) : sPos(dt) {}
DWORD      u32Color;            D3DXVECTOR2 sTex;
};

以上何度も申し訳御座いません。


YuO  2005-01-17 21:52:39  No: 56023

TEST(const D3DXVECTOR& dt) : sPos(dt), u32Color(0) {}
のようにすれば,u32Colorを初期化できます。


kossy  2005-01-17 22:55:35  No: 56024

YuOさん有難う御座います。
出来ました!

私の上記構造体では改行位置で醜かったのですが、
sTex込みで出来ました。

struct TEST {
  D3DXVECTOR3  sPos;
  DWORD        u32Color;
  D3DXVECTOR2  sTex;
  TEST(D3DXVECTOR3& dt, D3DXVECTOR2& dd) : sPos(dt), u32Color(0), sTex(dd) {}
};
  TEST test(D3DXVECTOR3(0.0f,1.0f,2.0f), D3DXVECTOR2(3.0f,4.0f) );

皆様、有難う御座いました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加