2017-10-31 7 views
2

クラスをネームスペース内でのみ使用できるようにすることはできますか?または、名前空間を使用せずに別の方法がありますか? 私はフレームワークの作成に取り組んでおり、このフレームワークのユーザーがすべてのクラスにアクセスできるようにする必要はありません。C++:クラスとそのデータメンバーの一部をネームスペースでのみ使用可能にする

しかし、ユーザーは、これらのクラスへのポインタ変数を作成するために、すべての定義に到達することができます。さらに、彼はこれらのクラスのすべてのデータメンバーにアクセスすることはできませんが、私のフレームワークがすべてのデータメンバーにアクセスできるようにします。

これは可能ですか?

例は、(ちょうど私の要求のための説明として):

/* T2DApp.h */ 
namespace T2D { 
    // I don't want the user to be able to create an instance of this class (only pointer vars), but the framework should be able to. 
    class T2DApp { 
    public: 
     // constructor, destructor... // 

     SDL_Window* Window; 
     SDL_Surface* Surface; 

     bool Running = false; 
    } 
} 

/* T2D.h */ 
#include "T2DApp.h" 

void init(); 

/* T2D.cpp */ 
#include "T2D.h" 

void init() { 
    T2D::T2DApp app;  // function in framework is able to create new instance of T2DApp. 
    app.Window.Whatever(); // every data member should be available to framework directly without getter methods. 
    app.Window.Whatever(); // dito 
    app.Running = true; // dito 
} 

/* [cpp of user] */ 
#include "T2D.h" 

void main(etc.) { 
    ... 
    T2D::T2DApp app; // User shouldn't be able to create an instance of T2DApp 
    T2D::T2DApp* p_app; // but he should still be able to "see" the class definition for creating pointers 
    ... 
    p_app.Running = true;  // User shouldn't be able to access this data member 
    p_app.Window.Whatever(); // But he should be able to access the other data members 
    p_app.Surface.Whatever(); // dito 
    ... 
} 

は事前にありがとうございました:)

+0

「T2DApp」の前後に「名前空間の詳細」または「名前空間の内部」があり、「名前空間 'detail' /内部のものはマニュアルでは触れません" – Justin

答えて

0

それはPimpl idiomで可能です:

「ポインタ「実装」または「pImpl」は、C++プログラミング技法であり、オブジェクトの表現からクラスのインプリメンテーションの詳細を、別々のクラス、不透明なポインタを介してアクセスします。

+0

ああ、私はこのテクニックについて一度読んだことを覚えています。このイディオムを使用することはお勧めできません。 –

+0

@TobbeWidnerこの手法では、コスト削減とポインターによる間接指定の間に余分なメモリーを割り当てるコストがかかります。これらの問題はどちらも、ポインタの代わりに 'std :: aligned_storage'を使用することで解消できますが、この場合は実装クラスのサイズをヘッダーに公開する必要があります。例えば。 https://github.com/sqjk/pimpl_ptr –

+0

ラッパークラスを作成するだけで、ユーザーが必要とするクラス「T2DApp」のメンバーを参照する追加のメソッドとデータメンバーを定義することができますか?アクセスするには?それとも、それは比較的大きなリソースの殺人者ですか? –

関連する問題