カプセル化 (情報の隠蔽) は非常に有用な概念であり、最小限の詳細のみがクラスの API で公開されるようにします。
しかし、C++ のやり方は少し不十分だと思わずにはいられません。たとえば、次のような (摂氏ベースの) 温度クラスを考えてみましょう。
class tTemp {
private:
double temp;
double tempF (double);
public:
tTemp ();
~tTemp ();
setTemp (double);
double getTemp ();
double getTempF ();
};
これは非常に単純なケースですが、カプセル化が完全ではないという点を示しています。「本物の」カプセル化は、次のような不要な情報をすべて隠します。
temp
データが変数 (およびその型)で内部的に保持されているという事実。- 華氏/摂氏変換のための内部ルーチンがあるという事実。
したがって、理想的には、クラスの実装者は上記のヘッダーを使用するように思われますが、クラスのクライアントはパブリック ビットのみを参照します。
誤解しないでほしいのですが、C++ はクライアントがプライベート ビットを使用できないようにするという目的を満たしているため、C++ を批判しているわけではありません。プライベート データと関数。
C++ では、実装者がこの情報を非表示にできるようにするにはどうすればよいですか(可能な場合)? C では、単純に不透明型を使用して内部の詳細を非表示にしますが、C++ ではどのようにそれを行うのでしょうか?
クライアントから完全に隠され、自分のコードだけが知っている別のクラスを維持し、そのインスタンスをvoid *
可視クラスに保持することができると思います (コード内でキャストします) が、それはかなり面倒なプロセスのようです。C++ で同じ目的を達成するためのより簡単な方法はありますか?