2011-07-24 12 views
0

だから私の考えは単純です - そのパブリックメソッド(擬似コード)の一部だけをforvardなり、自身の公開methosdsを持つことができ、クラスと入れ子になったクラスを持っている:C++ネストされたクラスを作成してメソッドを転送する方法は?

class API 
{ 
public: 
    go(); 
    stop(); 
    friend class B 
    { 
    public: 
     void public_request() 
     { 
      request(); 
     } 
     void public_go() 
     { 
      go() 
     } 
    }; 
private: 
    void request(){} 
}; 

は、そのようなネストされたを実現することが可能ですC++のクラスとは?

+0

なぜあなたはこれをしたいですか?単に '要求'を公開することは、はるかに面倒ではないようです。 –

答えて

1

Yesに外部クラスのオブジェクトのポインタまたは参照を渡す必要がありますが、外部クラスのインスタンスを提供する必要があるときに内側のものを作成してください... 2つのタイプは[主に]独立しているので、BAPIという特定のインスタンスに関連付けられていません。

詳細擬似コード

struct API { 
    void go(); 
    struct B { 
     B(API& api) : api(api) { } 
     void go() { api.go(); } 
    }; 
}; 

API a; 
B b(a); 
b.go(); 

あるいは、あなたがBの関数[B::go(API&)]

また
struct API { 
    void go(); 
    struct B { 
     void go(API& api) { api.go(); } 
    }; 
}; 

API a1, a2; 
B b; 
b.go(a1); 
b.go(a2); 

APIのインスタンスを渡すことができ、APIがない限りBのインスタンスを含んでいません明示的にインスタンスを追加します。また

struct API { 
    struct B { }; 
    B b; 
}; 

は、BAPIで友情を付与する必要はないことに注意してください。内部クラスとして、Bは既にAPIのプライベート/保護されたメンバーにアクセスできます。逆の場合は当てはまりません... Bに許可が与えられていない限り、Bのプライベート/保護されたメンバーにアクセスすることはできません。

1

少なくとも、Javaと同じではありません。ネストされたクラスには、ポインタまたは "外部"クラスへの参照が含まれている必要があります。

2

ローカルクラスをC++で作成することができます。ローカルクラスは、関数内で定義されたクラスです。
しかし、そのようなクラスにはいくつかの制限があります。詳細については、hereをお読みください。

作成できませんネイティブクラスはJavaのようにC++でネストされています。ネストされたクラスは、別のクラスのスコープ内のクラスです。

ネストされたクラスの名前は、その囲むクラスに対してローカルです(囲むクラスの範囲外には表示されません)。あなたが明示的なポインタや参照を使用しない限り、ネストされたクラスの宣言にのみ表示構文を使用することができ、型名、静的メンバ、および列挙子を含む囲むクラスから

された入れ子のクラスで注意すべき二つの重要なポイントは以下のとおりです。

  1. ネストされたクラスのメンバー関数は、通常のアクセス規則に従い、その囲むクラスのメンバーに特別なアクセス権を持ちません。
  2. 囲むクラスのメンバー関数は、ネストされたクラスのメンバーに特別なアクセス権を持ちません。

だから、あなたは構図を使用するか、明示的に入れ子になったクラス

関連する問題