厄介な問題を回避するために、コードをC#からC++にバックポートしようとしています。また、C#の「内部」に相当するものがC++で何であるかを誰かが知っているかどうかを尋ねたいと思います。
使用中の例を次に示します。
internal int InternalArray__ICollection_get_Count ()
{
return Length;
}
C++にはinternal
に直接相当するものはありません。 public
/protected
/private
を除いて、他の唯一のアクセス制御メカニズムはfriend
です。これにより、特定のクラスが自分のクラスのすべてのメンバー。
したがって、internal
のようなアクセス制御メカニズムとして使用できますが、大きな違いは次のとおりです。
friend
クラスを1つずつ明示的に宣言する必要がありますfriend
クラスは、例外なくすべてのメンバーにアクセスできます。これは非常に高レベルのアクセスであり、緊密な結合を引き起こす可能性があります(これが、friend
に対する通常の反射反応が「本当に必要ですか?」である理由です)。モジュール全体を互いに分離することを考えている場合は、2セットのヘッダーファイルを保持してみてください。1つは「public」メソッドを使用し、もう1つは「internal」メソッドを使用します。この時点で重複を回避する方法がわかりません。 AFAIKクラスは、コンパイルユニットで一度だけ宣言できます。パブリックヘッダーと内部ヘッダーの両方で、クラスの完全な定義が必要です。確かに非常に不格好な方法の1つは、_Foo.public.h
や_Foo.internal.h
のような、メソッド宣言のみを含む部分ファイルを作成することです。「実際の」ヘッダーファイルには、これらの1つまたは両方がクラス宣言本体に含まれます。
class Foo {
#include "_foo.public.h"
}
class Foo {
#include "_foo.internal.h"
}
ソースファイルは、独自のモジュールの内部ヘッダーを参照しますが、依存関係のパブリックヘッダーを参照します。プロジェクトのレイアウトを微調整し、スクリプトを作成して、これを適度に透過的にすることができるはずです。 (たとえば、各モジュールの正しいディレクトリへのインクルードパスを設定します。)
これは、実際のアクセス制御を実装するのではなく、単に「内部」メンバーを非表示にするだけなので、モジュールが個別にコンパイルされ、バイナリ依存関係として扱われることを前提としています。依存関係をソースツリーに含めてすべてを一度にコンパイルすることで処理する場合は、とにかく依存関係をビルドできる必要があり、内部メソッド宣言がビルドに残っている可能性があります。