BREW Array(2)

昨日の

  1. 外部からポインタをセット出来るようにしたい。どうしても大きな配列になってくるとメモリプールから確保するわけにはいかず、そういったときに配列クラスが使えないのは不便だ。
  2. Array クラスを、BREW Smart Pointer で作った BrewRefObject クラスへキャスト出来るようにしたい。このクラスも BrewRefObject クラスへキャスト出来るようにすることで、配列オブジェクトとそうでないオブジェクトをポリモーフィズム的に扱うことが出来るようになる。

これの、1は簡単に実装出来る。id:melpon:20060517 で書いたのと同じ事をすればいいのだ。
つまり、ポインタと一緒に Deleter を登録する。これだけで出来る。


しかし、2は非常に難しい。BrewRefObject は、id:melpon:20060601 のようなクラスになっていて、実体へのポインタと参照カウンタを持つことによって、参照オブジェクトを表現している。
このクラスは、継承した先でメンバを持ってはならない。なぜかというと、このオブジェクトは参照オブジェクトで、下位クラスから上位クラスへのコピーは当たり前のように発生する。
そうすると何が起こるかというと、スライシングだ。元の型に戻してもそれは有効ではない。
つまり、BrewRefObject を継承して、メンバに length を持てばいいだけの話ではないのだ。