掘り出し物1
ちょっと昔のプログラムあさってたら、そういやこんなのあったなぁってのが出てきた。
向きを表すクラス (by C++)
direction.h
#ifndef DIRECTION_H_INCLUDED #define DIRECTION_H_INCLUDED namespace laserbox { class direction; } class laserbox::direction { private: struct impl; impl* p; protected: direction(int dx, int dy); public: ~direction(void); virtual const direction* get_right(void) const = 0; int get_dx(void) const; int get_dy(void) const; static const laserbox::direction* const UP; static const laserbox::direction* const DOWN; static const laserbox::direction* const LEFT; static const laserbox::direction* const RIGHT; static const laserbox::direction* const NONE; }; #endif // DIRECTION_H_INCLUDED
direction.cpp
#include "direction.h" using laserbox::direction; struct direction::impl { public: int dx; int dy; impl(int dx, int dy) : dx(dx), dy(dy) {} }; direction::direction(int dx, int dy) : p(new impl(dx, dy)) {} direction::~direction(void) { delete p; } int direction::get_dx(void) const { return p->dx; } int direction::get_dy(void) const { return p->dy; } namespace { class up : public direction { public: up(int dx, int dy) : direction(dx, dy) {} virtual const direction* get_right(void) const { return direction::RIGHT; } }; class down : public direction { public: down(int dx, int dy) : direction(dx, dy) {} virtual const direction* get_right(void) const { return direction::LEFT; } }; class left : public direction { public: left(int dx, int dy) : direction(dx, dy) {} virtual const direction* get_right(void) const { return direction::UP; } }; class right : public direction { public: right(int dx, int dy) : direction(dx, dy) {} virtual const direction* get_right(void) const { return direction::DOWN; } }; class none : public direction { public: none(int dx, int dy) : direction(dx, dy) {} virtual const direction* get_right(void) const { return direction::NONE; } }; } const direction* const direction::UP = new up(0, 1); const direction* const direction::DOWN = new down(0, -1); const direction* const direction::LEFT = new left(-1, 0); const direction* const direction::RIGHT = new right(1, 0); const direction* const direction::NONE = new none(0, 0);
何に使ったかは覚えてない。ただ、自分の右が取得できる。
とりあえずC++ってこんな感じだったなぁと。