掘り出し物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++ってこんな感じだったなぁと。