web-dev-qa-db-ja.com

C#の内部に相当するC ++

厄介な問題を回避するために、コードをC#からC++にバックポートしようとしています。また、C#の「内部」に相当するものがC++で何であるかを誰かが知っているかどうかを尋ねたいと思います。

使用中の例を次に示します。

internal int InternalArray__ICollection_get_Count ()
        {
            return Length;
        }
21
user978122

C++にはinternalに直接相当するものはありません。 public/protected/privateを除いて、他の唯一のアクセス制御メカニズムはfriendです。これにより、特定のクラスが自分のクラスのすべてのメンバー。

したがって、internalのようなアクセス制御メカニズムとして使用できますが、大きな違いは次のとおりです。

  • friendクラスを1つずつ明示的に宣言する必要があります
  • friendクラスは、例外なくすべてのメンバーにアクセスできます。これは非常に高レベルのアクセスであり、緊密な結合を引き起こす可能性があります(これが、friendに対する通常の反射反応が「本当に必要ですか?」である理由です)。

参照 C++で「friend」をいつ使用する必要がありますか?

21
Jon

モジュール全体を互いに分離することを考えている場合は、2セットのヘッダーファイルを保持してみてください。1つは「public」メソッドを使用し、もう1つは「internal」メソッドを使用します。この時点で重複を回避する方法がわかりません。 AFAIKクラスは、コンパイルユニットで一度だけ宣言できます。パブリックヘッダーと内部ヘッダーの両方で、クラスの完全な定義が必要です。確かに非常に不格好な方法の1つは、_Foo.public.h_Foo.internal.hのような、メソッド宣言のみを含む部分ファイルを作成することです。「実際の」ヘッダーファイルには、これらの1つまたは両方がクラス宣言本体に含まれます。

Foo.public.h

class Foo {
    #include "_foo.public.h"
}

Foo.internal.h

class Foo {
    #include "_foo.internal.h"
}

ソースファイルは、独自のモジュールの内部ヘッダーを参照しますが、依存関係のパブリックヘッダーを参照します。プロジェクトのレイアウトを微調整し、スクリプトを作成して、これを適度に透過的にすることができるはずです。 (たとえば、各モジュールの正しいディレクトリへのインクルードパスを設定します。)

これは、実際のアクセス制御を実装するのではなく、単に「内部」メンバーを非表示にするだけなので、モジュールが個別にコンパイルされ、バイナリ依存関係として扱われることを前提としています。依存関係をソースツリーに含めてすべてを一度にコンパイルすることで処理する場合は、とにかく依存関係をビルドできる必要があり、内部メソッド宣言がビルドに残っている可能性があります。

4
millimoose