2012-01-05 7 views
0

friendクラスの関数は、次の例のようにローカルクラスで宣言できます。ローカルクラスのメンバーが関数定義の中でアクセスできない関数定義で定義されている場合、そのメンバーにアクセスするためにどのように使用できますか?ローカルクラスのfriend関数の使い方は?

void foo() 
{ 
    void bar(); 

    class MyClass 
    { 
     int x; 
     friend void bar(); 
    }; 
} 

void bar() { // error: cannot access local class here } 

int main() 
{ 
    //.. 
} 

答えて

1

MyClassのは、(fooの外にアクセス可能ではない)、したがって、あなたは(外FOOからそのメソッドのいずれかにアクセスすることはできません)。

foo()の呼び出しが完了した後にbar()を使いたい場合は、MyClassをいくつかの基本クラスから継承させるか、あるいは何らかのインターフェースを実装すると、そのインターフェースを実装するメソッドを呼び出すことができます。

+0

この例では、MyClassにはメソッドがありません。フレンド関数はメソッドではなく、フリー関数です。 – Potatoswatter

1

機能bar()は、foo()で定義されたclass MyClassにアクセスする方法はありません。そのクラスにアクセスする必要がある場合は、foo()関数から取り出します。

1

friendローカルクラスの関数宣言は、関数テンプレートの特殊化には依然として有効です。これは、C++ 11でのみ有効です。なぜなら、C++ 03のローカル型ではテンプレート引数が使用できないからです。

template< typename t > 
int bar(t &o) { 
    return ++ o.x; 
} 

int main() 
{ 
    class MyClass 
    { 
     int x; 

     friend int bar<>(MyClass &o); 

    public: 
     MyClass() : x(0) {} 
    }; 

    MyClass m; 

    std::cout << bar(m) << ", " << bar(m) << '\n'; 
} 

http://ideone.com/vcuml

そうでなければ、私はそのような宣言が何かを達成することができますどのように表示されません。

関連する問題