« 2010年8月 | トップページ | 2010年10月 »

2010年9月

2010年9月 8日 (水)

const_castを実装中のプログラムの中に見た

XMLはちょっとお休みです。

最近、関わっているプロジェクトのプログラム中に『const_cast』を見かけました。

const_castとは、constやvolatile修飾子を外すために使用するのですが、そもそも何か訳があってconstにしているわけで、それを外す必要があるということは、設計上誤りがあったということになると思います。

そういう場合は、const_castを使う前に、constをつけた設計があっていたのかどうかを見るべきでしょう。

しかし、大規模な変更になってしまう場合には、リスクを考え、const_castを使うのも一つの手かと思います。

また、読み取り専用として使うのだけど、constが邪魔という場合があります。それが、今回、見かけたパターンになります。

リストの中に何かのクラスが入っています。そのクラスの中にリストがあって、そのリストの中にやはり、別のクラスが入っています。クラスには、自身が持つリストにアクセスするためのイテレータを返す関数が用意されています。

最初のリストをconst_iteratorで取得してしまった場合、リストにあるクラスからそのリストを参照するときには、const属性でアクセスしなければいけません。ただし、リストを参照する関数のなかにconst属性で取得する関数が用意されていないとき、関数からリストが参照できません。コンパイルエラーです。まぁ、const属性で取得できる関数を用意すればいいのですが、const属性を外しても、読み取り専用として使わないのであれば、const_castもありかなと思いました。

こんな場面に出くわすのはそうそうないと思いますが、const_castが出てくるときには、何らかのミスが生じていると思われます。上記の例も、const属性で取得する関数を用意し忘れたというミスになります。

| | コメント (0) | トラックバック (0)

« 2010年8月 | トップページ | 2010年10月 »