2015/05/02

C++にfinallyがない!

Heavy obj = new Heavy();
try {
  obj.connect();
 obj.goodFunction();
} finally {
  obj.close();
}
のfinallyことだ。 何か処理した後、必ず最後に終了処理を入れて閉じたい、ということはよくあると思う。しかしC++にはこのfinallyという仕組みがない。
すると途中で終了する場合など終了処理のコードを全部に入れなきゃならなくなるので嫌なんだが。C++にこれが無いのは代わりにコンストラクタ、デストラクタを使え、ということらしい。
つまり、上記コードをClassとして分離し、コンストラクタで「Heavy obj = new ..」を行い、デストラクタで「obj.close();」を行う。すると、途中で何が起ころうと利用者側は意識せずともインスタンスの削除時に必ず終了処理が行われるということだ。
class Connector {
  Heavy* obj;

  Connector(){
    obj = new Heavy();
  }

  ~Connector(){
    obj->close();
    delete obj;
  }
  
  void doGood(){
    obj->connect();
   obj->goodFunction();
  }
}
と行いたい処理のラッパークラスを用意し(コードがすげぇ適当…)、利用者は、
Connector conn;
conn.doGood();
とだけすればよい。もちろんconnをnewで作っても良いがdeleteを忘れると終了処理をしない。
最初は小さなクラスが沢山出来そうで嫌な気がしたが実際にやってみると、ほぼ抵抗のない分解ができるのでこの考え方は悪くないと思う。

C++にinstanceof がない!というのもそうだし、コーディングはこうあるべしという主張が強い言語みたいだ。

0 件のコメント:

コメントを投稿