Как использовать функцию друга локального класса? - PullRequest
0 голосов
/ 05 января 2012

Поскольку функция друга может быть объявлена ​​в локальном классе, как показано в следующем примере.Как его можно использовать для доступа к членам локального класса, если он определен в определении функции, к которому нет доступа вне его?

void foo()
{
    void bar();

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

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

int main()
{
    //..
}

Ответы [ 3 ]

1 голос
/ 05 января 2012

Нет возможности для функции bar() получить доступ к class MyClass, определенному в функции foo().Если вам нужен доступ к этому классу, выньте его из функции foo().

1 голос
/ 05 января 2012

A 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

В противном случае, я не вижу, как это такдекларации могут выполнить все.

1 голос
/ 05 января 2012

MyClass недоступен вне foo (), поэтому вы не можете получить доступ ни к одному из его методов извне foo ().

Если вы хотите использовать bar () после завершения вызова foo (), сделайте MyClass наследованным от некоторого базового класса или реализуйте некоторый интерфейс, и тогда вы сможете вызывать его методы, которые реализуют интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...