C++でクラスを作るときに気を付けるべきこと
C++って,「このクラスこういう使い方していいの?」とか,「こう書いたらあれしたらマズイことになる」とか,「ほげほげなクラスはこう書かなくてはいけない」とか多すぎる気がするのでまとめてみる.
継承される可能性があるか
デストラクタかvirtualかそうでないかとかで継承にいろいろと気を使わなくてはならない. この辺りは調べればたくさん出てくるけど,よくわからないうちはvirtualがついてないクラスは継承してはいけないし,継承される可能性があるならvirtualをつけるようにする.
コピーされる可能性があるか
C++は自動でコピーコンストラクタが生成される. コピーしてはいけないクラスをコピーするとえらいことになる.
例えば
:::C++
class A {
int* p;
public:
A() {
p = new int(2);
}
~A() {
delete p;
}
};
int main () {
A a;
A b = a;
return 0;
}
とすると実行時エラーになる.
shared_ptrを使っても,指しているインスタンスは1つなので, 2つのインスタンスから同時にアクセスできることになる. 場合によってはかなりタチが悪いことになるのではないだろうか…
google style guide の DISALLOW_COPY_AND_ASSIGN マクロを使えばコピーを禁止できる.
インスタンスが複数存在して良いか
これはC++だけではないかな. Singletonにするかどうか.
イミュータブルかどうか
これもC++だけではないはず. const使いましょう.
インスタンスがvectorやsetなどの要素になってもよいか
vectorの要素になれるようにするためには,
- 引数をとらないコンストラクタ
- アドレスを参照される可能性がない
ということが必要. newしてポインタをコンテナに入れる分には特に気にすることはないはず.
などなど.間違ってる気もするし足りない気もする.C++恐ろしい.