« みふでもわかるWIN32API講座 - 簡単な描画編 | メイン | みふでもわかるPHP - 1 »

2005年09月03日

みふでもわかるC++番外篇 - ばらばらな物をまとめて扱う

static

クラスで共有するメンバを持つにはstaticを宣言する。
ただし、別に定義も行わなければ参照エラーが出る。
よって、使い方としては

class HOge{
public:
static int val
};

int HOge::val = 0;

list

描画対象オブジェクトは可変数、可変種存在できなければなりません。
つまり、言い換える必要は無いと思いますが、ある時点でいくつ存在するかわからずどんな種類の対象が存在するかもわからないという事です。
しかしだからといって、これを対象毎に制御していてはどんどんスパゲティーになっていき、最後にはにっちもさっちも行かなくなる事は目に見えています。

もっと具体的な書き方をしますと、
色々な種類の画面上オブジェクト毎にクラスを作りそれを制御するわけですが、当然状況によって存在するインスタンスの個数も変わるわけです。
また、描画を行うにはそれぞれのオブジェクトに描画をするようメッセージを渡す必要があるわけですが、様様なクラスから作られたインスタンスが入り混じっている状況で一括してメッセージを送る事はできないだろうか、という事です。

そこで登場するのがstatic宣言なのです。
上述の通り、staticな変数はそのクラスから作られたインスタンスで共有する事になり、インスタンスを通さずに参照できます。
つまり、staticなポインタから成るリストを作り、コンストラクタで自分自身をそのリストに追加し、デストラクタで削除するようにすれば良いのです。
描画を行う際にはこれまたstaticな関数(これまたインスタンスを通す必要が無いのです)でリストを辿り、順にメッセージを渡せば面倒無しに問題が解決できそうです。

しかし、staticな変数と言えどもその範囲は同じクラスのみであり、「様様なクラスが入り乱れる状況」においては複雑さが変わらないのではないでしょうか?
では、描画を必要とするクラスは全て一つの基底クラスから派生させるとしたら?
例えば基底クラスAから派生したクラスBがあるとして、AのポインタをBに向ける事が可能です。
ですから、基底クラスにおいてAのポインタを始点とするリスト構造とそれを辿る関数を用意しておき、必要な際に使用するようにすればこの問題は解決できると言えます。
もちろん、描画を司る関数を仮想関数にしておく等細かい部分のケアは必要ですが、大枠はこれで可能

……なのでしょうか。
JAVAの記憶+αで書いているので嘘だらけかもしれません。
理論上は行けると思うんですよ。きっと。
これがうまく行くのならば、色々便利なのです。だからどうかうまく行きますように。お願いしますです。

投稿者 miff : 2005年09月03日 09:58

コメント

あ……そうするとdraw関数もstaticじゃないとstaticな関数からは参照できないよ……。
でもdrawはインスタンス毎でないと(位置情報とかの参照の関係で)困るから……ぐふう

投稿者 miff : 2005年09月03日 10:21



XREAAD