Direct3Dのアプリを作ってまして、以下の書き方で構造体に初期値を
セットしようとしたのですが、コンパイルエラーとなります。
static D3DXVECTOR3 pos[2]={
{0.0f,0.0f,0.0f},
{0.0f,0.0f,0.0f}};
で、適当に色々試して見た所、以下の書き方ならコンパイルが通るこ
とを発見しました。
static D3DXVECTOR3 pos[2]={
FVECTOR3(0.0f,0.0f,0.0f),
FVECTOR3(0.0f,0.0f,0.0f)};
前者の書き方は一般的なものだと思うのですがなぜエラーになるので
しょうか?また後者の書き方はC++として正しい(使ってよい)ので
しょうか?
*D3DXVECTOR3の定義です。
typedef struct _D3DVECTOR {
float x;
float y;
float z;
} D3DVECTOR;
typedef struct D3DXVECTOR3 : public D3DVECTOR
{
public:
D3DXVECTOR3() {};
D3DXVECTOR3( CONST FLOAT * );
D3DXVECTOR3( CONST D3DVECTOR& );
D3DXVECTOR3( CONST D3DXFLOAT16 * );
D3DXVECTOR3( FLOAT x, FLOAT y, FLOAT z );
…略
}
すみません、
static D3DXVECTOR3 pos[2]={
FVECTOR3(0.0f,0.0f,0.0f),
FVECTOR3(0.0f,0.0f,0.0f)};
は
static D3DXVECTOR3 pos[2]={
D3DXVECTOR3(0.0f,0.0f,0.0f),
D3DXVECTOR3(0.0f,0.0f,0.0f)};
の間違いです。
D3DXVECTOR3がコンストラクタを持っているからです
この場合後者の初期化方法を用いることになるようです
後者のものは手元にある参考書にも書いてあるので、
使っても特に問題はないでしょう
というかたぶん他に方法がないんじゃないでしょうか
ちなみに今回の場合はどうだかわかりませんが、
仮に
D3DXVECTOR3(CONST FLOAT * f)
{
x = f;
y = f;
z = f;
}
という引数ひとつだけのコンストラクタを使う場合のみ、
通常の構造体と同じ記述で初期化できます
static D3DXVECTOR3 pos[]=
{
0.0f, 1.0f, 2.0f, 3.0f
};
x, y, zをそれぞれ別の数値にしたい場合はこれは使えませんけど
また、単に0.0fで初期化したいだけなら
デフォルトコンストラクタにその処理を入れておけば
static D3DXVECTOR3 pos[2];
だけで勝手に初期化されます
詳しい解説有難うございますm(__)m
私が使っているC++の参考書には後者の初期化の仕方が載って
いなかったため不安だったのですが、これで安心して使えます。
ちなみに解説を参考にしならが色々試していたのですが、コンス
トラクタが無くてもコンパイルエラーが出る場合がありまして、
さらに色々試したところ結局以下の感じになりました。
変数がpublicなら前者の初期化でもOK
変数がprivateなら後者の初期化じゃないと駄目
どうも前者の初期化は外部扱いのようですね。単にコンパイルエ
ラーの有無で調べただけなので断言はできませんが…
生成AIでも分からなかった問題だったためとてもためになりました。
ツイート | ![]() |