2016-10-12 2 views
4

Я пытаюсь понять концепцию дружбы во вложенных классах, но я не правильно понимаю концепцию. Я написал пример программы, чтобы понять это, но программа не работаетДружба во вложенных классах C++

#include<iostream> 

using namespace std; 


class outerClass 
{ 
    private: 
     int a; 
    public: 
     class innerClass; 
     bool print(innerClass); 
}; 

class innerClass 
{ 
    friend class outerClass; 
    private: 
     int b; 

    public: 
     innerClass() =default; 

}; 

bool outerClass::print(outerClass::innerClass obj) 
{ 
    cout<<"Value of b in inner class is:"<<obj.b; 
} 

int main() 
{ 
    outerClass in; 
    outerClass::innerClass obj; 
    obj.b=5; 
    in.print(obj); 
} 

Я получаю ниже ошибки:

try.cpp: In member function ‘bool outerClass::print(outerClass::innerClass)’: 
try.cpp:26:6: error: ‘obj’ has incomplete type 
try.cpp:11:15: error: forward declaration of ‘class outerClass::innerClass’ 
try.cpp: In function ‘int main()’: 
try.cpp:34:28: error: aggregate ‘outerClass::innerClass obj’ has incomplete type and cannot be defined 

Как я прочитал статьи на интернете я узнал следующие пункты, пожалуйста, комментарий на них если они верны или нет:

  • Внутренний класс Clark может обращаться ко всем членам внешнего класса по умолчанию.
  • Для доступа к закрытым членам innnerClass для внешнего класса необходимо сделать externalClass как класс friend для innerClass.

Пожалуйста, помогите с указанием ошибки в коде, а также, если точки, которые я понял, верны.

+0

Вот [намек на определение внутренних классов] (http://stackoverflow.com/questions/8693590/how-to-make -an-inner-class-without-put-the-definition-of-inner-class-to-pare) вне определения внешнего класса – grek40

ответ

2

Если вы хотите определить innerClass за пределами outerClass, вот как это сделать:

class outerClass 
{ 
    class innerClass; // forward declaration 
}; 

class outerClass::innerClass // definition 
{ 
}; 

Остальное все в порядке, за исключением obj.b=5. Класс outerClass имеет доступ к innerClass::b, функция main() - нет.

Demo


InnerClass может получить доступ ко всем членам OuterClass по умолчанию.

Право. От стандартной [class.access.nest]:

Вложенный класс является членом и, таким образом, имеет те же права доступа, как и любой другой член.


Для OuterClass, чтобы получить доступ к закрытым членам innnerClass нам нужно сделать OuterClass в другом классе к InnerClass.

Право. Из стандартных [class.access.nest]:

Членов класса вмещающего не имеет специальный доступа к членам вложенного класса;

+0

Я исправил эту ошибку, но все же я не могу получить доступ к частному члену innerClass в функции печати. Не могли бы вы помочь? –

+0

@MayankJain см. Демо. – sergej

+0

Вы имеете в виду? «вы не можете сделать это в главном» .. (вы написали can) –

4

Линия class innerClass;outerClass в это опережающее объявление к class, что вы никогда не определите.

Следовательно outerClass::innerClass является неполным типом.

Отдельный innerClass определение, которое начинается с

class innerClass 
{ 

является полностью отличается class к классу вперед объявлены.

Нет ничего плохого в вашем заявлении friend class outerClass; в пределах определенного innerClass.

+0

Извините, что это была пустая ошибка. Я исправлю это, но даже сейчас я не могу получить доступ к частному члену 'b' функции innerClass в функции печати. –

0

Я думаю, что вы путаете с nested class и friend class
Вы можете использовать friend class не используя nested class и
вы можете использовать nested class не используя friend class

Вот несколько примеров:

class A {}; 
class B {}; 

Здесь класс A знает класс B, но B не может знать класс A. Поэтому вам нужно указать классу A, что класс B существует.
Это делает вещь, называется Вперед Декларация
Итак:

class B;  // forward declaration 
class A {}; // A knows the B 
class B {}; // B knows the A 
Смежные вопросы