Re[2]: нюансы организации friend-методов
От: _hum_ Беларусь  
Дата: 09.06.15 11:23
Оценка:
Здравствуйте, Myrgy, Вы писали:

M>Здравствуйте, _hum_


M>incpomplete тип, так как CI пока еще не знает о том, что в CA будет какой-то метод. а с friend class CA прокатывает, так как вы делаете брендом весь класс, соответственно допускается incomplete тип.


вроде ж у же выяснили, что суть проблемы не в этом, а в том, что объявление френдом метода приравнивается к декларации (прототипированию) этого метода, а значит, предоставляет возможность его вызова еще до определения. а это не приводит к неоднозначности и противоречиям, только если до вызова (а значит, и до декларирования) уже будет определен класс, которому принадлежит данный метод. отсюда и требование — объявление френд-метода должно идти по тексту только после определения класса этого метода.

M>что бы решить проблему поменяйте местами классы и перенесите код методов в .cpp файлы


M>
M>class CI;

M>class CA
M>{
M>public:
M>    void test(CI* ci);
M>};

M>class CI
M>{
M>  friend void CA::test(CI* ci);
M>  private: 
M>   int data;
M>};

M>// in .cpp
M>void CA::test(CI* ci)
M>{
    ci->>data = 5;
M>}

M>int main() {
M>    // your code goes here
M>    return 0;
M>}
M>


этот вариант плох тем, что требует вынесение объекта типа CI за пределы класса CA (обратите внимание,в первоначально варианте значение результата инкапсулировано в сам объект класса CA)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.