0

次の例に示すように、フレンド関数はローカル クラスで宣言できるためです。外部からアクセスできない関数定義で定義されている場合、ローカルクラスのメンバーにアクセスするためにどのように使用できますか?

void foo()
{
    void bar();

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

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

int main()
{
    //..
}
4

3 に答える 3

1

ローカル クラスでのfriend関数宣言は、関数テンプレートの特殊化に役立ちます。C++03 ではローカル型をテンプレート引数にすることができないため、これは C++11 でのみ当てはまります。

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

そうでなければ、そのような宣言がどのように達成できるかわかりません。

于 2012-01-05T08:03:34.597 に答える
1

MyClass は foo() の外ではアクセスできないため、foo() の外からそのメソッドにアクセスすることはできません。

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

于 2012-01-05T06:50:28.647 に答える
1

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

于 2012-01-05T06:50:38.720 に答える