2014年4月14日月曜日

角度を扱うクラス (未完成)

角度を扱うクラスって見ないなぁ,と思って作ってみた.angle(度数法)とradian(弧度法)を表すクラスで,それぞれに代入する場合は意図的に書かないとできないようにした.角度を受け取る関数なんかで仮引数の型としてこのクラスを使うことで,度数法で渡して欲しいのか,弧度法で渡して欲しいのかがはっきりするな,と思ったり.

#define _USE_MATH_DEFINES
#include <cmath>
#include <iostream>
using namespace std;
class angle;
class radian;
// angle(度数法)とradian(弧度法)の実装がほぼ同じなため
// 共通処理をまとめる
template <typename T>
class angle_base {
protected:
explicit angle_base(float v)
: mValue(v)
{}
explicit angle_base(angle_base const & v)
: mValue(v.value())
{}
public:
float value() const
{
return mValue;
}
T & operator+=(T const & rhs)
{
mValue += rhs.value();
return *static_cast<T *>(this);
}
T & operator-=(T const & rhs)
{
mValue -= rhs.value();
return *static_cast<T *>(this);
}
T & operator*=(float rhs)
{
mValue *= rhs;
return *static_cast<T *>(this);
}
private:
float mValue;
};
class angle : public angle_base<angle> {
public:
explicit angle(float v = 0.f)
: angle_base<angle>(v)
{}
explicit angle(radian const & rad);
};
class radian : public angle_base<radian> {
public:
explicit radian(float v = 0.f)
: angle_base<radian>(v)
{}
explicit radian(angle const & ang);
};
// 両方のクラスがangle_baseを継承していることがわからないと
// value()が利用できないので,実装を分離
angle::angle(radian const & rad)
: angle_base<angle>(rad.value() / M_PI * 180.f)
{}
radian::radian(angle const & ang)
: angle_base<radian>(ang.value() / 180.f * M_PI)
{}
int main(int argc, char ** argv)
{
angle a(90.f);
angle b(45.f);
angle c;
radian r;
c += a;
// compile error
// r = a;
r = radian(a);
cout << a.value() << endl;
cout << b.value() << endl;
cout << c.value() << endl;
cout << r.value() << endl;
return 0;
}
view raw angle.cpp hosted with ❤ by GitHub


一度作ってから,実装がほぼ同じなのでCRTPでまとめてみたものの,二項演算子の実装があんまりすっきりしなくて,いったん放置.

しかし,何故こういう安全策が用意されないのかなぁ,と考えていて,そもそもこういう角度を扱うような状況って処理速度が云々って言っていることが多いし,const参照で渡したら間接参照になるから多少は速度が落ちるかも,とか考えているのではないかと.

2014年4月1日火曜日

ゲームプログラマとしての三年目のまとめ

ゲームプログラマ,そして社会人としての三年目も終わったのでまとめ.

今年度の仕事

試作から関わっていたプロジェクトが何とか発売を迎え,一段落.今年度の後半は次のプロジェクトへ.こちらも試作前から関わっているので,数年は関わることになりそう.

今のところ会社のライブラリを利用して何とかやっていけているけれど,そのうち一人で一通りのシステムを組んでみたいものです.

今年は,新人の面倒とかも見てました.C#やJavaがメインだった子が増えてきているのか,微妙にC++の作法が分かってなかったり.まだしばらくC++がメインなので,色々教えることも考えないといけないかもなぁ,とか思いました.

もうちょっとプログラミングについて語れる子がいれば良かったけれど,出来そうな子ほど一年目から忙しくなったりするのがちょっと悲しかったり.

目立つの大事

良くも悪くも目立つというのは大事だなぁ,って思いました.もちろん,悪い方向で目立つと悪い結果になるんですけどね.良い方向に目立ってると,例えば給料の値上げをしてもらう場合も話を通しやすかったり.

じゃあ,目立つにはどうすれば良いか,というと,やっぱり声を上げ続けることかなぁ,と.新人だったりするとつい遠慮してしまうかもしれませんが,特にプログラマの場合,経験年数と実力が比例するわけではないので,先輩の言うことだから,とか気にせず,自分がこうだと思うことを言ってしまえば良いかなって.

最後に

正直なところ,3年目は結構穏やかに終わったなぁ,という感じ.強いて挙げるとすれば,やはり今のままのやり方じゃまずいよなぁ,という実感が強まった.もうちょっとプログラマの教育だとかドキュメント作成だとかをしっかりやっていく方向にしないと,色々と厳しい気がする.

他の会社ではどうやっているのかなぁ,といったことを知るためにも,今年度は勉強会などにももっと参加して,色々な人と知り合いたいなぁ,と思う.