(実装の詳細を隠す目的で)名前空間を隠すことが可能であると思われるSOに関する他の同様の質問に対するいくつかの回答を読みましたが、その方法については述べていませんでした。
したがって、たとえば、namespace A
を含みnamespace B
、エンドユーザーから隠したいというB
機能の厄介な実装の詳細が必要な場合、外部に表示されないようにA
使用できるリンカーのトリックがありますが、プログラムの残りの部分にはまだ表示されていますか?B
A
A
(実装の詳細を隠す目的で)名前空間を隠すことが可能であると思われるSOに関する他の同様の質問に対するいくつかの回答を読みましたが、その方法については述べていませんでした。
したがって、たとえば、namespace A
を含みnamespace B
、エンドユーザーから隠したいというB
機能の厄介な実装の詳細が必要な場合、外部に表示されないようにA
使用できるリンカーのトリックがありますが、プログラムの残りの部分にはまだ表示されていますか?B
A
A
あなたが話しているように見えるのは、「Pimpl」パターン、および/またはHandle/Bodyイディオムです。またはあなたが思い付くことができる他のいくつかの名前。そのような本当に短い例は、ブーストスマートポインタページにあります。不完全な型のクラスをスマートポインターに宣言してから、別の場所で実装を定義する方法について説明します。サイズは実装のみであり、ヘッダーファイルではないため、「内部」クラスの実装はライブラリ作成者以外は再コンパイルせずに変更できるため、これはAPIユーザーから「非表示」になります。「パブリック」クラスのサイズのみがわかっており、一定のままです。2つの.cppファイルと1つの.hppファイルを読み、それが機能する理由について意味があるかどうかを確認します。
それがあなたがやろうとしていることに関係していることを願っています。
名前空間の目的は、名前の衝突を回避することです。それが本質的にすべてです。それらは何かを隠すための機能を提供しません。ある程度までは、強制的に書き込みますがnamesp_name::sometinng
。これにより、ユーザーはこれを行う価値があるかどうかを考えることができます。
上記のコメントが示唆しているのは、基本的にヘッダーをパブリックヘッダーとプライベートヘッダーに分割することです。プライベートヘッダーはcppファイルにのみ含まれ、上位層のコードに含まれることは想定されていません。これは多くの場合に機能し、これは役に立ちますが、すべての問題を解決するわけではありません。