構造体の初期化とクラスの利用について

このQ&Aのポイント
  • 構造体を生成する際の初期化を簡略化する方法について教えてください。
  • 構造体を利用している場合、初期化を毎回行わなくてもよい方法はありますか?
  • 構造体をクラスに変更することで初期化を簡潔にする方法についてアドバイスをいただけますか?
回答を見る
  • ベストアンサー

構造体を生成時にわざわざ初期化しないようにしたいのですが。

ヘッダーファイルにstruct XXXを定義して、 struct XXX{ int x; int y; } 生成時に、 struct XXX param = {0,0}; のような初期化を毎回行う必要がないようにしたいのですが、 構造体を利用している時点でそれは不可能でしょうか? そこで、structをやめて、以下のようにclassにしてしまえば解決しそうですが、 class XXX{ public: XXX(): x(0); y(0); {}; ~XXX(){}; int x; int y; } この解決方法について同じような経験あるかたいらっしゃいましたらコメントいただけませんか? 私的には少し大げさなような気がしています。 classにpublic変数を持たせるのも変な感じがしますし、そもそも構造体用のclassを作ることがあるのかなって疑問に思ってます。 お気づきかと思いますが経験が浅いので、この解決方法が常套手段なのかどうかが知りたいところです。 お詳しい方、つっこみでも良いのでお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

構造体にもコンストラクタを定義できます。 >そこで、structをやめて、以下のようにclassにしてしまえば解決しそうですが、 と同じですけど。 >classにpublic変数を持たせるのも変な感じがしますし、 >そもそも構造体用のclassを作ることがあるのかなって疑問に思ってます。 用途が明確であれば、別に変ではないと思います。

y_anily
質問者

お礼

構造体にもコンストラクタを定義できるんですね。 ありがとうございます。 structとclassの違いはないのですね。

その他の回答 (4)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.5

>これは引数が1つの場合ではないでしょうか? デフォルト値を与えれば、XXX hoge(5) は XXX hoge(5,0)と解釈されます。

y_anily
質問者

お礼

そっ、そうなんですか。 いままで引数1つの場合のみ有効なものだと思ってました。 とすると、explicitは必要ですね。 ありがとうございます!

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.4

>便利というのは?前々からexplicitの旨みを感じる機会がなかったのですが。。。 コンストラクタにデフォルト引数を与えておけば、XXX hoge; とするケースにも、 XXX fuge(1,1); とするケースにも対応できますね。 explicit 指定子は hoge = 5; のような int から XXX への暗黙的な変換を禁止することで、 コーディングミスを減らそうという意図ですね。

y_anily
質問者

お礼

引き続きご回答ありがとうございます。 >explicit 指定子は hoge = 5; のような int から XXX への暗黙的な変換を禁止することで、 >コーディングミスを減らそうという意図ですね。 これは引数が1つの場合ではないでしょうか? そもそも2つ以上のときにはコンパイラによっては暗黙的な変換ができてしまうのでしょうか?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

C++ において「構造体」とは「デフォルトですべて public なクラス」にほかなりません。つまり「構造体」と「クラス」は基本的に同じものです。

y_anily
質問者

お礼

外部関数を持たないものは構造体、 外部関数を持つものをクラスと 使い分けているかたもいるようですが、 業界的にはどうなのでしょうね? あまり精通していないので分かりませんが、 基本的には違いのですね。 ありがとうございます。

回答No.2

 こんにちは。 >>classにpublic変数を持たせるのも変な感じがしますし、そもそも構造体用のclassを作ることがあるのかなって疑問に思ってます。  STLのstd::pair<T1, T2>辺りが其の例かもしれません。  後コンストラクタですが、  XXX() : x(0), y(0){ }  とするよりは、  explicit XXX(int __x = 0, int __y = 0) : x(__x), y(__y){ }  とした方が、何かと便利です。  まぁ、見慣れるまでは違和感あるかもしれません。

y_anily
質問者

お礼

explicitはコンストラクタの最適化を明示的にしないようにすることですね。 便利というのは?前々からexplicitの旨みを感じる機会がなかったのですが。。。

関連するQ&A

  • 構造体の中の構造体

    typedef struct number{ int x; struct number *next; }Num; 初心者な質問で申し訳ないんですが、構造体の中に構造体があるのはどう解釈していいんでしょうか? typedef struct number{ int x; int y; }Num; の場合はNum a,b;がint a.x,a.y,b.x,b.yとなるのは分かるんですが・・・

  • 構造体の代入と比較

    構造体のコピーは以下のようで正しいと思いますが、 struct A { int a; }; struct x, y; x.a=1; y = x; 構造体の比較は if (x != y)ではいけないのでしょうか? 構造体に限らずクラスも同じ考えでしょうか?

  • 構造体(問題→回答)

    えっと、昨日先生に 「構造体を作れ!」と言われて 全然出来ませんでした。 本とかを見て理解するのではなくて、 実際に自分で何も見ないで 出来るようになりたいのです。 で、何でもいいので、 何か問題を出して欲しいのです。 昨日の先生の例:四角形を作れ! #include <stdio.h> struct Sikaku{ int x1; int y1; int x2; int y2; }; main() { struct Sikaku s[100]; s[0].x1 = 20; s[0].y1 = 20; s[0].x2 = 40; s[0].y2 = 40; } 何か問題を出したら、考えて回答を書きますので、よろしくお願いします。 いっぱい出してください。 お願いします。

  • 構造体のすべての変数を文字列に変換したい

    以下のような3つの構造体が与えられたときに、構造体tdが初期化されているとします。 そのときに、構造体tdのすべての要素を文字列に変換したいのですが,ひとつひとつ sprintf を使って変換するのは、ソースファイルにひとつずつ書かなければならず、あまり用いたくありません。 何かよい方法はないのでしょうか? ご回答よろしくお願いします。 struct area{  int x;  int y;  int r[20]; }; struct pinf{  struct area;  int s;  int r[18]; }; struct td{  char no[4];  char name[20];  struct pinf p1,p2[10];  int tpc;  int r[20]; };

  • 構造体配列の初期化関数をつくる

    C言語での数値プログラミング的な質問です。 例えば, 自作関数で, =========== void shokika(int n, double *x) { int i; for(i=0;i<n;i++) x[i] = 1.0; } =========== とつくり, int main(void) { double x[10]; shokika(10,x); return 0; } とすると, x[0]~x[9]まで1.0を入れることができますが, 配列x[10]を, struct abc { double x, y; } a[10]; というように構造体の配列としてa[i].xとしたときに, 上記のshokika関数の同等の処理をしてくれる (つまり, a[0].x=...=a[9].x=1.0と処理する) 自作関数をつくりたいのですが、どうしたらいいでしょうか。

  • 構造体配列の初期化について

    C初心者です。 宜しくお願い致します。 某社のSDKを参考にプログラムを作成しておりますが、構造体配列の初期化する方法がわからなくて困っています。 下記の構造体の初期化をしたいのですが、どのような方法で初期化すればいいかわからない状態です。 すいませんが、ご教授いただきたく宜しくお願い申し上げます。 typedef struct ioctl_videomode { V2U_INT32 width; V2U_INT32 height; V2U_INT32 vfreq; } V2U_PACKED V2U_VideoMode; typedef struct v2u_rect { V2U_INT32 x; V2U_INT32 y; V2U_INT32 width; V2U_INT32 height; } V2U_PACKED V2URect; typedef struct ioctl_grabframe2 { void * pixbuf; V2U_INT32 pixbuflen; V2U_UINT32 palette; V2URect crop; V2U_VideoMode mode; V2U_INT32 imagelen; V2U_INT32 retcode; } V2U_GrabFrame2; typedef struct { V2U_GrabFrame2* frame; char ftime[16]; }frameinfo; void main() { frameinfo fr[512]; //初期化したい →→ fr = (frameinfo*)malloc(sizeof(frameinfo)*512); } error C2106: '=' : 左のオペランドが、左辺値になっていません

  • クラス内の構造体の実体化とアクセス方法が・・

    クラス内の構造体の実体化とアクセス方法が解らなくて困っていまし。 ヘッダーで class data { public: struct SET_A { int time; char name[24]; }; }; と宣言したクラス内の構造体を使いたくて data::SET_A dataseta; dataseta.time = 1; などとしても構文エラーになってしまいます。 クラス内の構造体はどう実体化してアクセスしたりすれば良いのでしょうか?

  • 構造体の要素すべてに対する四則演算の方法を教えてください.

    構造体の要素すべてに対する四則演算の方法を教えてください. たとえば、 2点a,bの座標成分x,y,zをそれぞれの座標ごとに足す方法を教えてください. 下のようにx,y,z成分を持ったa,bがあります。 struct point{ int x; int y; int z; }; struct point a; struct point b; struct point c; この場合, c=a+b; と書くことができず, それぞれの成分ごとに以下のように足さなくてはなりません. c.x=a.x+b.x; c.y=a.y+b.y; c.z=a.z+b.z; この方法でできるのですが, 非常に効率的でないのでなにかもっと簡単に記述する方法を教えてください. お願いいたします.

  • ポインタを使った構造体のプログラム

    ポインタを使ってメンバに値を入力して表示するプログラムを作ったのですが、mainのstruct XYZ aというオブジェクトと*bというそれを指すポインタを使ってプログラムを表示するにはどうすればいいのでしょうか。 これがプログラムです。 #include <stdio.h> struct XYZ { int x; long int y; double z; }; void set_xyz(struct XYZ *p,int x,long int y,double z) { p->x=x; p->y=y; p->z=z; } //void set_xyz(struct XYZ *,int,long int,double); int main() { struct XYZ a = {12,999999,1.41421356},*b; //ここのポインタ変数bでエラーが表示されます。 set_xyz(b,a.x,a.y,a.z); printf("a.x = %d\na.y = %d\na.z = %lf\n",b->x,b->y,b->z); return 0; } エラーの内容は「初期化されていないローカル変数 'b' が使用されます」となっています。 初歩的な質問ですみません・・・。

  • 複数のライブラリをリンクするときに構造体が衝突する

    C++,開発環境はVisual Studio Professional 2013です, ライブラリ1にxy座標の構造体 struct point { int x; int y; }; を定義しています. ライブラリ2にも全く同じ構造体を定義しています. ここで,あるプロジェクトからこれら2つのライブラリをリンクしようとしたら, error C2011: 'point' : 'struct' 型の再定義 というコンパイルエラーが出ます. ライブラリ1とライブラリ2にpoint構造体が記述された共通用のヘッダを参照させるという方法をとれば解決できるのでしょうが,この方法以外でこのエラーをなんとか回避する方法はないでしょうか. 構造体宣言は只の宣言であって実体をもたないため,中身が同じであればいくら記述が重複しても問題はないと聞いたことがあったので大丈夫だと思っていました. また,ライブラリ1とライブラリ2のpoint構造体の名前それぞれpoint1,point2にするなど違うものにするという方法でも回避できるのでしょうが,下記のメインコード内でコメントアウトされている部分のように,構造体の中身が全く同じなので互換性を持たせられるようにしたいのです. ちなみに,ライブラリ1,2はコンソールアプリケーション・空のプロジェクトで作成したあと,ソリューションのプロパティで「構成の種類」を「スタティックライブラリ(.lib)」にするという手順で作成しています. 以下,簡略コード ====ライブラリ1==== ----lib1.h---- #ifndef _H1_ #define _H1_ struct point { int x; int y; }; void print_lib1(struct point p); #endif ----lib1.cpp---- #include "lib1.h" #include <iostream> void print_lib1(struct point p) { std::cout << "lib1 : " << p.x << ", " << p.y << std::endl; } =====ライブラリ2====== ----lib2.h---- #ifndef _H2_ #define _H2_ struct point { int x; int y; }; void print_lib2(struct point p); #endif ----lib2.cpp---- #include "lib2.h" #include <iostream> void print_lib2(struct point p) { std::cout << "lib2 : " << p.x << ", " << p.y << std::endl; } ===メインコード=== ----main.cpp---- #include "../../lib1/lib1/lib1.h" #include "../../lib2/lib2/lib2.h" int main(void) { struct point val; val.x = 2; val.y = 3; print_lib1(val); //print_lib2(val); }