あらすじ
まず、はじめに初めての投稿なのでミスや誤りがあれば申し訳ない。
また、学習歴がC言語を約8ヶ月、C++言語を約4ヶ月なので言語仕様などを理解しきれていない部分があったりするので指摘等あればコメントでいただければ...
ゲーム制作にあたりオブジェクト指向を意識してextremeなコーディングをしようとなったのがきっかけでプリミティブ型をラップすることになった。
「コンストラクタキャスト」と聞いたのは初めてではないだろうか。
なぜなら、私の造語だから。
ただ、単語から多少の意味は理解できるのではないか。
なぜ、こんなキャスト?が思いついたのか。
それは、ある時プログラムで以下のような記述をした。
struct Vector2{
Vector2(CoordinateX x, CoordinateY y):x(x),y(y);
CoordinateX x;
CoordinateY y;
}
class Object{
private:
Vector2 vec(0 , 0);
}
ここで本題の問題が生じた。
本題
さて、このあらすじを踏まえてどのような問題が出たのか。
それは、クラス内での変数宣言時にコンストラクタを呼ぼうとすると必然的に関数定義として捉えられることである。
この問題を解決するべく今度は以下の記述をした。
class Object{
private:
Vector2 vec = {0, 0};
}
この記述は一様初期化である。
この記述をした当時は一様初期化とは知らなかった。
ただ、これだと型が明示的でなくて分かりづらいと思い以下のような記述に変えた。
class Object{
private:
Vector2 vec = Vector2(CoordinateX(0), CoordinateY(0));
}
これはコンストラクタでそのクラスが保持するメンバ変数に値を代入するものであるから成り立つ。
しかし、この記述ではプリミティブ型をラップしているとはいえ、型が明示的なのはとてもわかりやすく、私としてはこちらのほうが納得できる記述であった。
そして、コンストラクタを用いてプリミティブ型をキャストするような記述だったので
「コンストラクタキャスト」という名前で読んでいた。
#まとめ
今回が初投稿で文脈等分かりづらかったと思うが、結論として一様初期化を使うことが本来の初期化の仕方であるが、実際に使ってみると暗黙的に変換され分かりづらく、意図しない値が入るかもしれない。
今回の私のようにextremeなコーディングをしていると尚更だ。
なのでこのようにプリミティブ型ラップをしたりしていればそのラップクラスでこのようなコンストラクタを作っておくことで
この記述が使えるためより効果を発揮するのではないだろうか。
明示的に書くことで間違えが少なくなるのは少なくとも初学者の私にとっては嬉しい記法である。