C++ グチ
仕事の話、C++でおおはまり。まる一日判らなくて、実装変えて強引に作ったけどやっぱ気持ち悪くてまた調べ続けた話。(もしかしたら初心者的かも)
背景
仕事がらベクトルを使うことが多い。
Class Vector { .... float x,y,z; }
でやっぱ三次元の座標ならxyzだけどカラースペースならrgbで、時には配列v[3]でアクセスしたいと思うのが人情です。
Class Vector { .... union { struct { float x,y,z; }; struct { float r,g,b; }; float v[3]; } };
という実装をしてたんです。ここまでがまずかったのかなぁ。でもこれ作ったのもう数年も前のことでして。
で今度このそれぞれの要素がアニメーションすることにしたいので
templateClass Vector { .... union { struct { T x,y,z; }; struct { T r,g,b; }; T v[3]; } };
としてムフフとか思ってたら、プログラムが終了するときに異常終了しまくり。原因はTのデコンストラクタが呼ばれまくって...プログラムの他でコピーとかしてるのか何なのかと大騒ぎ。(Tの中でSTLを使っててその開放が何度も呼ばれて落ちる)
#include
ってやったら
C2621 メンバ 'identifier' (共用体 'union' 内) でコピー コンストラクタが用いられています。
MSDNで調べたら(なぜかオンラインだとかからない)
「共用体メンバにコピー コンストラクタを持たせることはできません。」
ガクッ...unionの中でクラスが使えないんですね。stuctで囲ったのでエラー出してくれなかったんですね...(修正 templateだからコンパイラには判らないのか...モウナンデモイイヤ)
まぁ勉強になりました。unionなんて窓から投げ捨てる。
また作り直しだ。