- ベストアンサー
C++、クラスメンバの構造体配列の初期化について
クラスのメンバに構造体の配列を持っていて、その構造体はfloat値を4つ持ってます。 私はいつもメンバ変数の初期化はコンストラクタでしています。 クラス生成時に全てのfloatを0で初期化したいのですが、これはコンストラクタでfor文を回すしかないのでしょうか? 一文で初期化することは出来ないのでしょうか? 話は少し変わってしまいますが、今思ったのですがコンストラクタで値を決めるのは初期化じゃなくて代入と呼ぶのですかね? ご助力よろしくお願いします。
- majuppitto
- お礼率87% (28/32)
- C・C++・C#
- 回答数4
- ありがとう数5
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
memsetで0にする場合。 float の 0.0f が、内部表現の オール0 になっている、とは限りません。 一致しない表現が採用されているかもしれません。 memsetがforループより効率がいいかどうか、わかりません。 実際の動作が forが ・「sizeof(float)ずつの書き込み+ループカウンタの計算+ループカウンタの比較」 が配列要素数 memsetが ・「1byteずつの書き込み+ループカウンタの計算+ループカウンタの比較」 が配列要素数*sizeof(float) + 関数の呼び出しのオーバーヘッド なら、forの方が効率がよいはずです。 利用できるのなら、 std::array等にする、というのも手です。
その他の回答 (3)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> クラス生成時に全てのfloatを0で初期化したいのですが A::A() { std::fill(ary, ary+4, 0.0f); }
お礼
御返事遅くれてしまい申し訳ございません。 ありがとうございました!
- wormhole
- ベストアンサー率28% (1619/5653)
floatの配列を0で初期化というだけなら float a[16] = {0}; のようにすればできたかと。 質問の方では構造体のメンバとしてfloatが複数あって、配列なのは構造体の方なので上記の手は使えません。 ですがC++での構造体はデフォルトのアクセス指定子がpublicなクラスでもありますから、その構造体のコンストラクタを作っておいて、そこでfloat変数を初期化するという手もあります。
お礼
御返事遅くれてしまい申し訳ございません。 ありがとうございました!
ゼロで初期化するだけなら、C言語標準のmemset関数が使えますね。
お礼
御返事遅くれてしまい申し訳ございません。 ありがとうございました!
関連するQ&A
- 構造体のメンバ初期化について
構造体のメンバを初期化したいのですが、 メンバ数が多いので1個ずつ初期化するのは面倒です。 そのため、一度に初期化する方法を探していたのですが、 memsetやZeroMemoryなどで可能だということが解りました。 しかし、パディング等の問題を含めて この関数を使用しても問題ないのでしょうか? 以下に例を挙げます。 typedef struct SAMPLE { char a; int b; int c; float d; SAMPLE(){ ZeroMemory( this, sizeof(Sample) ); } } Sample; 構造体Sampleは32bitマシンでは 一見13byteに見えますが、パディングが入るので、 実際にはsizeof(Sample)は16byteと表示されます。 また、構造体には自動的に初期化と解放するための、 コンストラクタ・デストラクタのみがあり、 関数や仮想関数などの実装はありません。 この方法の安全性について、 ご存知の方がいらっしゃればアドバイスいただけると助かります。 よろしくおねがいします
- ベストアンサー
- C・C++・C#
- 多次元配列の構造体の初期化
タイトル通りです。やり方がわかりません。 構造体変数の初期化や多次元配列の初期化が載ってるページは多いのですが、コレだけは調べても解りませんでした。 typedef struct{ int flag; ~~~~~(略)~~~ }map_t; map_t map[64][64]; の後、map_t型のmap64*64の int flag全てに値を代入したいのですが 詳しいやり方が解りません。 int hensuu[3][3]={ {1,2,3},{4,5,6},{7,8,9} }; 普通の多次元配列みたいにmこんな感じでやりたいんですけど… 初心者でスミマセン。回答いただけたらありがたいです。
- ベストアンサー
- C・C++・C#
- 構造体変数がないとメンバ操作できないのはなぜ?
C言語の構造体に関して質問がありますが、structで型を作成して、構造体変数にてメンバの代入・参照をする。ということなんですが、なんでメンバ操作には構造体変数からでないといけないのでしょうか? 直接、型枠にてメンバ操作をすれば良いのに、なぜ構造体変数から操作しないといけないのでしょうか? 「クラス」や「オブジェクト」みたいに、一々ゼロから作成したり、コピペで作成しなくても済むように、このような形になっているのでしょうか? 回答の方よろしくお願いします。
- 締切済み
- その他(プログラミング・開発)
- 構造体のマスクというメンバ
一般的な構造体についての質問です。 例えば CHOOSECOLOR 構造体のようにメンバにマスクを持つ構造体があって、 その構造体に値を代入する関数を使うには、CHOOSECOLOR 構造体のマスクを 設定し、そのマスクで有効にしたメンバだけが値を入れられるんですよね? マスクを持つ構造体というのは、それに値を入れる関数を使う前に マスクを指定してから、その構造体のアドレスを関数の引数にセット するんですよね? マスクは無視されて、それ以外の全てのメンバに値が入るというわけでは ないですよね?
- ベストアンサー
- C・C++・C#
- C++ 構造体の一括初期化 {0}
構造体変数に {0} を代入すると、CString は空文字、 intは0に一括で初期化されるようです。 なんでこんなことが出来るのでしょう? {0}は何? 仕組みを教えて下さい!!
- ベストアンサー
- C・C++・C#
- C言語の構造体の配列の扱い方
#include <stdio.h> struct record { char name[10]; float height; float weight; }; /* 各データを、長さ 5 の record 構造体の配列に代入 */ struct record records[5] = { { "yasuo", 170.5, 70.5 }, { "hideaki", 176.5, 65.8 }, { "nobu", 166.5, 58.2 }, { "yuichi", 168.0, 65.4 }, { "nori", 152.7, 68.6 } }; float std_weight(struct record r){ /* 標準体重 = (身長 - 100) * 0.9 */ return (r.height - 100.0) * 0.9; } float std_weight(struct record r); となっている時に、メイン関数にて、5人の身長をもとめる方法と適正標準体重を求める方法を教えてください。構造体の配列を一括で扱うコードがいまいちわかりません。おねがいします。
- 締切済み
- C・C++・C#
- perlはc++のようなクラスや構造体は作れない?
c++で class hoge{ hoge(); int menber; }; というようなクラス定義と hoge x; というようなクラス変数定義のようなのは、Perlではできないのでしょうか。 メンバ関数はべつにいいのですが、その構造を配列にして管理したいのです。 たとえば、個人情報のような。 Perlではスタティックなメンバしか持てないと聞いたのですが、本当ですか?
- ベストアンサー
- Perl
- 参照送りした構造体のメンバ変数の扱い方が
自作関数に構造体のポインタを送り、メンバ変数の値を扱いたいのですが、 &で送り、*で受け取り、*とアロー演算子でメンバを指定しても 「error C2100: 間接指定演算子 (*) の使い方が正しくありません。」 と出てしまいます。 変数と構造体とでは勝手が違うのでしょうか? どうすればメンバ変数の値を扱えるのでしょうか。
- ベストアンサー
- C・C++・C#
- 構造体のメンバ参照について(C言語)
初めて書き込みする,taroimotenです. 以下のプログラムを作ってみたのですが, メモリ参照エラーが表示され,うまく動きません. アドバイスおねがいします! #include <stdio.h> #include <stdlib.h> // 型宣言. typedef struct data DATA; typedef struct coords COORDS; // 構造体の定義. struct data{ COORDS *pnt[3]; }; struct coords{ float r1; float r2; }; int main(void) { DATA *ptr; DATA x; // ポインタ変数の初期化. ptr = &x; // メンバへの値の代入. ptr->pnt[0]->r1 = 100.0; printf(" r1 : %f \n",ptr->pnt[0]->r1); return EXIT_SUCCESS; }
- ベストアンサー
- C・C++・C#
お礼
御返事遅くれてしまい申し訳ございません。 ありがとうございました!