以前、メンバ関数にもconstをつけようよ、という話を書きました。
[c++]貸すだけなんだから、汚さないでよね!
で、思い出したこんな話。
class File{
FILE* fp;
public:
int open(const char *path, const char *mode){fp = fopen(path, mode); return fp == NULL;}
int close(){return fclose(fp);}
int read(void *ptr, size_t size, size_t nmemb){return fread(ptr, size, nmemb);}
int write(const void *ptr, size_t size, size_t nmemb){return fwrite(ptr, size, nmemb);}
int eof(){return feof(fp);}
int seek(int offset, int whence)){return fseek(fp, offset, whence);}
int tell()){return ftell(fp);}
};
ファイルのラッパクラスを作りました。
エラー処理やら型が違うやらいわれそうですが、その辺は置いておきます。
今回の話は、この中のどのメンバ関数にconstをつけるべきか、という話です。
constをつけるとメンバー変数の書き換えから保護されます。
上記のクラスの場合、open関数はメンバ変数fpを書き換えているので、
open関数にconstをつけるとコンパイルエラーがでます。
なお、open関数以外はconstをつけてもエラーが出ません。
実際、こんな感じでopen関数以外はすべてconstがついているソースがあったわけです。
私の考えだと、つけてもよいのはeofとtellだけです。
理由は、これらの関数はfpの先をも書き換えてないと推測できるからです。
推測というのが若干弱いですが。
まぁ、現在だとconstすらついてないというのが多いのでこんなことになっているのは少数ですが、
エラーが出ない限りつければいい、ってもんじゃないんだってことです。