構造体の初期化

解決


タイゾー  2005-11-04 22:16:22  No: 59478

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 );
…略
}


タイゾー  2005-11-04 22:18:43  No: 59479

すみません、
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)};
の間違いです。


  2005-11-04 22:48:53  No: 59480

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];
だけで勝手に初期化されます


タイゾー  2005-11-05 22:00:29  No: 59481

詳しい解説有難うございますm(__)m

私が使っているC++の参考書には後者の初期化の仕方が載って
いなかったため不安だったのですが、これで安心して使えます。

ちなみに解説を参考にしならが色々試していたのですが、コンス
トラクタが無くてもコンパイルエラーが出る場合がありまして、
さらに色々試したところ結局以下の感じになりました。

変数がpublicなら前者の初期化でもOK
変数がprivateなら後者の初期化じゃないと駄目

どうも前者の初期化は外部扱いのようですね。単にコンパイルエ
ラーの有無で調べただけなので断言はできませんが…


脱カフェインちゃん  2024-07-24 09:27:28  No: 151539

生成AIでも分からなかった問題だったためとてもためになりました。


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

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






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