[迷信] コンパイルエラーが出るのでアクセス指定子を修正
C++を使ってチームで開発していると、一度ぐらいは必ず遭遇したことがある恐怖の間違いがあります。それが、コンパイルエラーを取り除くためにアクセス指定子を修正すればよいという考え方です。具体的にどういうことか見ていきましょう。
{
public:
...
private:
int bar_;
};
上のようなクラス定義があったとします。このクラスでは、セオリー通りデータメンバを非公開にしています。そして、データメンバ bar_ は、メンバ関数を呼び出したときに適切に操作されるようになっていると考えてください。get_bar や set_bar のようないわゆるアクセッサは設けず、あくまでも foo クラスの実装の詳細という位置づけです。
この foo クラスのクライアントコードを書いている担当者が、foo クラスを何とか使いこなそうとして、実装を理解するためにソースコードを読むことはよくあります。クラスはブラックボックスとして考えればよいなどという建前論は大抵無意味です。遅かれ早かれ、彼は foo クラスの内部状態を保持しているデータメンバ bar_ を見つけることでしょう。そして、この bar_ の値を外部から参照したいと考えるかもしれません。
C++に不慣れなのか、private というアクセス指定子を見落としたのかは知りませんが、foo クラスのクライアントコードで直接 foo::bar_ を参照するようなコードを書いてしまい、彼は、当然のことながら、コンパイルエラーに遭遇しました。エラーメッセージを見てすぐに、エラーの原因が foo::bar_ が private だからということに気付きました。
ここから問題行動が始まります。
foo::bar_ は private であり、外部から参照することはできません。ですので、この値を参照してどうにかするというのは、そもそもの設計に問題があるわけです。しかし、彼がこれまでに書いたコードは foo::bar_ の値を参照できることに強く依存しており、今さらそれらを全部捨てて書き直すのは大変です。そこで、こっそり private を public に書き換えてしまいます。これで彼が書いたコードはコンパイルに成功し、期待通りに動作しました。"彼は"万々歳です。
こんな冗談のようなことが実際にはしばしば発生します。データメンバを private にしていたのは、彼のような無茶をする相手からオブジェクトを保護するために、foo クラスの設計者がそのようにしたわけです。いわば、foo クラスの免疫機構のようなものです。彼の行為はその免疫機構を破壊する行為であり、foo クラスとそのオブジェクトを病原菌(=オブジェクトを破壊するようなクライアントコードによる間違った操作)に対して無防備にしてしまいます。
foo::bar_ が public になれば、今や自在に foo::bar_ を外部から変更できるようになってしまいます。もはや破綻は時間の問題です。
トラックバック
ブックナビゲーション
- 技術情報
- Boost C++ Libraries メモ
- C++と組込み環境
- C++サンプル集
- C++テンプレート集
- C++プログラマのためのC言語入門
- C/C++迷信集
- [迷信] 'A'~'Z' の値は連続している
- [迷信] 0xe-0xe はゼロ
- [迷信] 1 バイトは 8 ビット
- [迷信] 2の累乗による割り算と右シフトは等価
- [迷信] FILE 型は構造体
- [迷信] abs は常に非負の値を返す
- [迷信] argv[0] はプログラム名
- [迷信] char 型は符号付き
- [迷信] double の出力書式は "%lf"
- [迷信] fflush で入力バッファをクリア
- [迷信] free でメモリを開放する
- [迷信] free に NULL を渡すとクラッシュする
- [迷信] gets は単純に fgets に置き換えられる
- [迷信] isalpha 関数の引数は char 型
- [迷信] new に失敗すると NULL が返る。
- [迷信] scanf ではバッファオーバーランを防げない
- [迷信] scanf でキーボードから入力
- [迷信] setjmp マクロの返却値は変数に代入できる
- [迷信] sizeof は定数式
- [迷信] void main(void)
- [迷信] とりあえず memset で初期化
- [迷信] アルゴリズム関数内で関数オブジェクトはコピーされない
- [迷信] オブジェクトの動的生成に失敗するとメモリリークする
- [迷信] コンストラクタから例外を送出してはならない
- [迷信] コンストラクタで自身をゼロクリア
- [迷信] コンパイラはプログラマの心を察してくれる
- [迷信] コンパイルエラーが出るのでアクセス指定子を修正
- [迷信] ソースコード中の即値を全廃せよ
- [迷信] ソースファイルの末尾に }
- [迷信] データ列のソートには qsort 関数を使うべし
- [迷信] プログラムは必ず main から始まる
- [迷信] 一重引用符の中には一文字しか書けない
- [迷信] 今どき int が 16 ビットの処理系なんて無い
- [迷信] 入力データ格納用配列のサイズは BUFSIZ
- [迷信] 割付けたメモリはプログラマが自分で解放しなければならない
- [迷信] 実数型とは浮動小数点型のことである
- [迷信] 引用符で囲んだヘッダ名はカレントディレクトリから探索する
- [迷信] 文字列から整数への変換には atoi
- [迷信] 構造体のタグ名は下線で始める
- [迷信] 構造体はクラスではない
- [迷信] 識別子に使える文字は英数字と下線のみ
- [迷信] 非局所オブジェクトは外部結合
- C言語再入門
- C言語徹底入門
- Drupal メモ
- TOPPERS 情報
- ライブラリ開発入門
- 分割コンパイルをきわめる
- 擬似プロセッサを作る
- 車輪の再発明
- 過去の情報

