Проблема с предварительным объявлением
От: zfima  
Дата: 28.09.09 08:58
Оценка:
Привет всем.
Наткнулся на проблему с предварительным объявлением


#include <iostream>

class A{
    int a_val;
    
public:
    class B;
    A(int i): a_val(i){}
    friend void compare(A a, B b);
};

class B{
    int b_val;
public:
    B(int i): b_val(i){}
    friend void compare(A a, B b);
};

void compare(A a, B b){
    (a.a_val > b.b_val) ? std::cout << "object of A class greater" : std::cout << "object of B class greater";
}


#include <iostream>
class B;

class A{
    int a_val;
    
public:
    A(int i): a_val(i){}
    friend void compare(A a, B b);
};

class B{
    int b_val;
public:
    B(int i): b_val(i){}
    friend void compare(A a, B b);
};

void compare(A a, B b){
    (a.a_val > b.b_val) ? std::cout << "object of A class greater" : std::cout << "object of B class greater";
}


Первая версия компилируется, вторая жалуется на
Error 1 error C2248: 'A::a_val' : cannot access private member declared in class 'A' c:\documents and settings\fima\my documents\visual studio 2008\projects\schildt_c++\100\100\main.cpp 20

из-за предварительного объявления класса B

Почему?

спасибо
Re: Проблема с предварительным объявлением
От: Bell Россия  
Дата: 28.09.09 09:14
Оценка:
Здравствуйте, zfima, Вы писали:

...

Z>Первая версия компилируется, вторая жалуется на

Наверное, ты хотел сказать "вторая компилируется, первая жалуется"?

Z>Почему?

Потому что в первом случае другом класса А объявляется функция с сигнатурой
void compare(A a, A::B b);

которая не имеет отношение к определяемой тобой функции
void compare(A a, B b)



Z>спасибо
Любите книгу — источник знаний (с) М.Горький
Re[2]: Проблема с предварительным объявлением
От: zfima  
Дата: 28.09.09 09:21
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, zfima, Вы писали:


B>...


Z>>Первая версия компилируется, вторая жалуется на

B>Наверное, ты хотел сказать "вторая компилируется, первая жалуется"?

Z>>Почему?

B>Потому что в первом случае другом класса А объявляется функция с сигнатурой
B>
B>void compare(A a, A::B b);
B>

B>которая не имеет отношение к определяемой тобой функции
B>
B>void compare(A a, B b)
B>



Z>>спасибо



Большое спасибо!!!
понятно
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.