1

私の知る限り、C ++には3つのアクセス指定子しかありません:privatepublicprotected

これらの3つのアクセス指定子を使用して、プロジェクト内のクラスではメソッドを使用できるが、「外国人」では使用できないようにするにはどうすればよいですか??(C#の内部およびパブリックなど)

4

4 に答える 4

8

C++ は、プロジェクトが何であるかを知りません。

C++ は、あなたが言及した 3 つのアクセス指定子を提供するクラスについて知っています。

C++ は翻訳単位を認識しており、内部リンケージと外部リンケージの 2 つのアクセス指定子を提供しています。

編集:内部および外部リンケージについて、これはシンボルが翻訳単位(オブジェクトファイル)の外側に表示されるかどうかに関連しています。TU で定義されたグローバルstaticまたは変数には、内部リンケージがあります。constその他は外部リンクがあります。

于 2010-09-24T08:58:35.033 に答える
5

簡単に言えば、そうではありません。C++ は C# のようなものではありません。

特定のライブラリまたは実行可能ファイルの外部でクラスを使用可能にしたくない場合は、プロジェクトのユーザーにヘッダー ファイルを提供しないでください。

于 2010-09-24T09:06:48.673 に答える
1

passkey friend イディオムを使用できます。

ただし、これは検索できる用語ではありません。このアイデアは新しいものではありませんが、それほど一般的ではなく、SO で発生したようなものです。上記のリンクは、一般的な解決策での私の試みです (C++03 ではきれいに行うことは不可能で、C++0x では美しい)。

私はそれをやろうとする他の方法があると確信していますが、何らかの理由で私は上記に愛着を持っています... :)


しかし、そうでなければ、いいえ。はるかに一般的で単純な解決策は、detail名前空間 (たとえば、 Boost全体で一般的) に自分のものを投げて、「そこには行かないでください」と言うだけです。

于 2010-09-24T09:08:28.517 に答える
0

解決策に最も近い 2 つのことは次のとおりです。

  1. 実際には公開しないコードで使用する内部名前空間を用意します。次に、ライブラリのユーザーは、一般に使用することを目的とした名前空間を使用します。ただし、強制されていません。名前空間について必ずしも知らない、または使用しないように指示されているという点で難読化されているため、使用しません。

  2. フレンドを使用します。これ、コンパイラによって強制されます。クラスが別のクラスのフレンドである場合、または関数がクラスのフレンドである場合、そのプライベート メンバー関数にアクセスできますが、他のクラスはアクセスできません。残念ながら、それは友人がすべてのプライベート メンバーにアクセスできることを意味するため、さまざまなクラスや関数に必要以上にアクセスすることができます (ただし、ライブラリのユーザーのクラスや関数ではなく、独自のクラスや関数内にあります)。 )。

C++ は、アクセス レベルをより細かく制御できる C#、Java、D などの言語よりも古い言語です。C++ は、この種の多くのことを開拓しましたが、常に正しいとは限りませんでした。新しい言語の設計者はそこから学び、多くの点で改良を加えてきたので、新しい言語には C++ にはない特定の概念を見つけることができます (ただし、新しい言語には採用されていない概念が C++ にある場合もあります)。他の例としては、パッケージとシールされた/最終的なクラスと関数があります。

于 2010-09-24T09:48:28.853 に答える