Доступность внутреннего класса

#c #class #oop

#c #класс #ооп

Вопрос:

 #include<iostream> 
using namespace std; 
 
template <class T, class U>
class Enclosing {       
    private:    
       int x; 
    public:
    class Nested;

    Nested setnested (int x){
        Enclosing::Nested* temp;
        temp->A->x=5;
        return *temp;
    }

    class Nested { 
        Enclosing *A  ;  
        void NestedFun() { 
        cout<<this->A->x;   
        }        
    }; 
};


  
int main() 
{      
  return 0;
} 
  

Этот код работает хорошо, но если я устраняю шаблонный признак включения класса, появляются ошибки.

 'Enclosing* Enclosing::Nested::A' is private within this context.
  

Как переопределить вложенный setnested(int x) вне класса?

Ответ №1:

Этот код работает хорошо, но если я устраняю шаблонный признак включения класса, появляются ошибки.

На самом деле, та же ошибка относится и к версии шаблона, просто спецификатор доступа A не проверяется, пока setnested не будет создан экземпляр.

Если вы добавите эти строки в main :

 Enclosing<int,int> e;
e.setnested(42);
  

вы получаете ту же ошибку.


Один из способов исправить это — подружиться Enclosing Nested с, например, так:

 class Nested { 
    friend class Enclosing;  
    // ...
};
  

Вот демонстрация.


Как переопределить вложенный setnested(int x) вне класса?

 template <class T, class U>
auto Enclosing<T, U>::setnested(int x) -> Nested {
    Enclosing::Nested* temp;
    temp->A->x=5;
    return *temp;
}
  

Вот демонстрация.