КС friend

Тема в разделе "LANGS.C", создана пользователем systemio, 19 июл 2008.

  1. systemio

    systemio New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    98
    Народ помогите пож со следующей фигнёй.

    есть 2 класса в 2 файлах

    Код (Text):
    1. #ifndef FILE1_H
    2. #define FILE1_H
    3.  
    4. #include "File2.h"
    5.  
    6. class cC2;
    7.  
    8. class cC1
    9. {
    10.     public: void c1_pub_f(void) { }
    11.  
    12.     friend void cC2::c2_pub_f(void);
    13.     private: void c1_pri_f(void) { }
    14. };
    15.  
    16.  
    17. #ifndef FILE2_H
    18. #define FILE2_H
    19.  
    20. #include "File1.h"
    21.  
    22. class cC1;
    23.  
    24. class cC2
    25. {
    26.     public: void c2_pub_f(void) { }
    27.  
    28.     friend void cC1::c1_pub_f(void);
    29.     private: void c2_pri_f(void) { }
    30. };
    31.  
    32. #endif
    если теперь эти 2 файла подрубить в main.cpp то будет ошибка компиляции на КС friend. Как разрулить данную коллизию - даже не представляю!?
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    systemio

    Вроде бы никак. По-любому для одного из классов будет попытка обратиться к функции только при наличии forward declaration, что, естественно, делать нельзя. Видимо никак.

    Можно сделать workaround - сделать дружественными free-function.

    Код (Text):
    1. class cC1;
    2. class cC2;
    3.  
    4. void fooC1(cC1& c);
    5. void fooC2(cC1& c);
    6.  
    7. class cC1
    8. {
    9.     public: void c1_pub_f(void) { }
    10.  
    11.     friend void fooC2(C2&);
    12.     private: void c1_pri_f(void) { }
    13. };
    14.  
    15.  
    16. #ifndef FILE2_H
    17. #define FILE2_H
    18.  
    19. #include "File1.h"
    20.  
    21. class cC1;
    22.  
    23. class cC2
    24. {
    25.     public: void c2_pub_f(void) { }
    26.  
    27.     friend void fooC1(C1&);
    28.     private: void c2_pri_f(void) { }
    29. };
    И теперь, внутри этих функций можно юзать объекты на правах друзей.
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Что-то редактирование не работает. Вот это в прошлом посте лишнее:

    Код (Text):
    1. #ifndef FILE2_H
    2. #define FILE2_H
    3.  
    4. #include "File1.h"
    5.  
    6. class cC1;
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Вот что пишет Липман:
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Booster

    Незачот твоему Липману))) Лучше сделать дружественную free-function, это дает меньшие связи.
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    _DEN_
    Ну так книженция называется "C++ для начинающих", по-этому думаю простительно. В С++ немного забавляет тот факт, что порой нужно искать нетривиальные пути. Но на то он и С++, что просто умывает руки предоставляя всё делать нам самим, в этом его сила и слабость одновременно.

    Кстати этим же методом решается проблема функций друзей при наследовании. Так как при наследовании дружба не наследуется, то вызов из неё внешней функции, которая является другом, может решить и эту проблему.
     
  7. systemio

    systemio New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    98
    Спасибо за ответы!!!