2009-07-19 18 views
1

これは、クラスをパブリックまたはプライベートとして定義することについての質問です。名前空間のプライベート/パブリッククラスの問題

今、私は名前空間の内部で定義されたさまざまなクラスを持っています。私はこれらのクラスのうちのうちを外界に見えるようにしたいだけです。

たとえば、以下のクラスがプログラム内の唯一のクラスである場合、私はmain.cppがMyPrivateクラスではなくMyPublicクラスのみを参照/使用できるようにしたいと思います。 MyPrivateクラスをプライベートクラスとして定義し、MyPublicクラスをパブリックとして定義すると、これが達成されますが、以下のコードが動作し、main.cppはMyPrivateオブジェクトを宣言できます。

C++でこれを行うことはできますか?

MyPrivate.h:

namespace MyNamespace{ 

    // only classes inside of the MyNamespace should be able 
    // to use this 
    private ref class MyPrivate{ 
     ... 
    }; 
} 

MyPublic.h:

#include "MyPrivate.h" 

namespace MyNamespace { 

    // anyone can declare this 
    public ref class MyPublic{ 
     ... 
     private: 
      MyNamespace::MyPrivate^ p; 
     ... 
    }; 
} 

MAIN.CPP:

#include "MyPublic.h" 

int main(){ 

    MyNamespace::MyPublic p_yes; // this is fine  
    MyNamespace::MyPrivate p_no; // don't want this to be possible 

    return 0; 
} 
+0

これはドットネットの「managed C++」です。「C++」ではありません。 – ChrisW

+0

C++、またはC++/CLIを使用していますか? – Thanatos

+0

私は管理されていないC++のように、パブリック/プライベートクラスのようなものはないので、質問にタグを付け直しました。 –

答えて

3

このような状況では、パブリック/プライベートはクラスが外部に表示されている方法に影響しますアセンブリー、あなたがいくつかの唯一のものによってのみ使用できるという意味で「私的」なクラスを作成したい場合

 
namespace MyNamespace { 
    public ref class MyPublic { 
     private: 

      ref class MyPrivate { 
       public: 
       int x; 
      }; 

      MyPrivate^ p; 
    }; 
} 

//編集: あなたが途中でまだpublic:セクションで、この入れ子になったクラスをスローし、このようにそれを使用することができます:
MyNamespace::MyPublic::MyPrivate priv;

0
Rクラス、あなたはこのように、ネストされたCLASメカニズムを使用することができます

パブリックヘッダーにプライベートヘッダーを含めないでください。 ForwardはMyPublic.cppにのみプライベートクラスとインクルードヘッダーを宣言します。それとも、普通のC++を使っていたら、それは私が言うことです。 Bastardized .Net方言は事を変えるかもしれない。

0

残念ながら、クラスのアクセス修飾子は、構築しているアセンブリの外側の可視性にのみ影響します。 C++では、あなたが記述している方法で名前空間に適用されるアクセス修飾子の種類はサポートされていません。

これをシミュレートするための一般的なイディオムは、「プライベート」コードをdetail名前空間に配置することです(例:MyNamespace::detailに入れる)。これは多くの場合に使用されます。ブーストライブラリ。慣習的に、詳細名前空間のコードは、囲み名前空間のコードでのみ使用する必要があります(MyNamespace::detailMyNamespaceのコードでのみ使用します)。ただし、コンパイラはこれを強制しません。

1

プライベートキーワードは、あなたが思う以外の何かを意味します。 refクラスの可視性をアセンブリの範囲を超えて制限します。 Main()メソッドは同じアセンブリ内にあるので、型名を参照するのに問題はありません。 C#言語の「internal」キーワードは同じことを意味します。

私はいつか、これらのクラスがいつか別のアセンブリになることを想定しています。したがって、プライベートを使用することは確かに十分です。ネストされたプライベートクラスを使用すると、クラスを同じアセンブリ内のコードにアクセスできなくなる可能性があります。

関連する問題