2009-05-16 4 views
1

Я знаю, что можно создать функцию друга в C++:Возможно ли создать «класс друга» на C++?

class box 
{ 
friend void add(int num); 
private: 
int contents; 
}; 

void add(int num) 
{ 
box::contents = num; 
return; 
} 

Но есть способ, чтобы создать друг классы?

NB: Я знаю, что в этом коде, вероятно, много ошибок, я не использую функции друзей и еще довольно новичок в языке; если есть, скажите, пожалуйста.

ответ

7

Да - в декларации class Box, сделать

friend class SomeOtherClass; 

Все функции-члены SomeOtherClass смогут получить доступ к contents члена (и любые другие частные члены) любого Box.

+0

и я полагаю, что для определения SomeOtherClass, вы просто напишите «SomeOt herClass {public: int someothercontents;}; вне декларации Box? – 2009-05-16 01:46:39

+0

@ Keand64: SomeOtherClass будет правильно определенным классом, так что да, вы делаете все, что вы сделали, чтобы определить класс Box. –

2

Кстати, дизайн ориентиром является то, что, если класс достаточно близко, чтобы быть объявлен другом, то это достаточно близко, чтобы быть объявлен как вложенный класс в одном заголовочном файле, например:

class Box 
{ 
    class SomeOtherClass 
    { 
    //some implementation that might want to access private members of box 
    }; 
    friend class SomeOtherClass; 
private: 
    int contents; 
}; 

Если вы не хотите объявлять другой класс как вложенный класс в том же заголовочном файле, то, возможно, вы не должны (хотя и можете) объявить его другом.

0

В вашем коде, вы в настоящее время с помощью «содержимое» членов коробки в качестве статического члена в функции добавления (коробчатых :: содержание = Num;)

Вы должны либо объявить содержание как статические, так как (вы также должны инициализировать его тогда ..)

class box 
{ 
    friend void add(int num); 
    private: 
     static int contents; 
}; 

int box::contents; 

void add(int num) 
{ 
    box::contents = num; 
    return; 
} 

или изменить функцию добавления принять объект окна и INT:

class box 
{ 
    friend void add(box *b, int num); 
    private: 
     int contents; 
}; 

void add(box *b, int num) 
{ 
    b->contents = num; 
    return; 
} 
Смежные вопросы