初めまして。超くだらない質問ですが、困っております。
複数の構造体をメンバに持つ構造体を定義時に初期化しようとしております。
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
以上申し訳無いですが宜しくお願い致します。
違ってたらごめんなさい
たぶんD3DXVECTOR3がコンストラクタを持ってるからではないですかね?
コンストラクタの無い構造体を内部に持たせた場合は普通に初期化できますし
もっとも仕様とかはあんまり詳しくないんでなぜかはわかりませんが・・・
解決策としては外側の構造体にもコンストラクタを作って、
それで初期化するとか
struct TEST{
D3DXVECTOR3 sPos;
TEST(D3DXVECTOR3& dt){sPos = dt;}
};
main()
{
TEST test(D3DXVECTOR3(0.0f,0.0f,0.0f));
}
みたいな
もし何かずれてること言っちゃってる場合は誰かツッコミお願いします
> TEST(D3DXVECTOR3& dt){sPos = dt;}
これではデフォルトコンストラクタが呼ばれ、期待するメンバ変数の「初期化」は出来ません。
メンバイニシャライザによって、適切なコンストラクタを指定して初期化を行います。
struct TEST {
D3DXVECTOR3 sPos;
TEST(D3DXVECTOR3& dt) : sPos(dt) {}
};
ただ、私は上記構造体/クラスの詳細は知らないため、コピーコンストラクタやoperator=()が
どう定義されているかは知りません。(もしかしたら、↑の代入でもOK?)
あ、確かにわたしのだと
デフォルトコンストラクタ呼び出し→代入
って流れになっちゃうのかな?
明確に「初期化」を求めるならとおりさんの方法がいいかもしれませんね
参考までにコピーコンストラクタやoperator=()は特に定義されてないみたいです
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/directx9_c/directx/graphics/reference/d3dx/structures/d3dxvector3.asp
憂さん、とおりさん有難う御座います。
C++滅多に使わないもので、コンストラクタ気が付きませんでした。
試したところ巧く行きました!
もう一点お伺いしたいのですが、
下記メンバを増やした際に
コンストラクタを持たないDWORDと
コンストラクタを持つD3DXVECTOR2と
の場合の定義はどのようにすれば良いのでしょうか?
こちらも全て初期化する事は出来ますでしょうか?
struct TEST {
D3DXVECTOR3 sPos;
TEST(D3DXVECTOR3& dt) : sPos(dt) {}
DWORD u32Color; D3DXVECTOR2 sTex;
};
以上何度も申し訳御座いません。
TEST(const D3DXVECTOR& dt) : sPos(dt), u32Color(0) {}
のようにすれば,u32Colorを初期化できます。
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) );
皆様、有難う御座いました。
ツイート | ![]() |