2015-07-05 2 views
0

Я написал два класса: функция первого класса не может получить доступ к частному члену второго класса, хотя эта функция является другом для второго класса. Затем я нашел этот пример из msdn.microsoft.com но есть еще ошибка:cannot access private member declared in class BФункции и классы членов класса в качестве друзей

здесь code from MSDN:

class B; 
class A { 
public: 
    int Func1(B& b); 

private: 
    int Func2(B& b); 
}; 

class B { 
private: 
    int _b; 

    // A::Func1 is a friend function to class B 
    // so A::Func1 has access to all members of B 
    friend int A::Func1(B&); 
}; 

int A::Func1(B& b) { return b._b; }//the same error as the one below is here 
int A::Func2(B& b) { return b._b; } 

, когда я пишу class A себя как друга для B там нет ошибка, но я хочу иметь только функцию, которую я хочу быть другом для класса B не целым class A

Это ошибка моего компилятора или этот код является неправильным?

+0

У вас не должно возникнуть проблем, если [вы сделаете это правильно] (http://ideone.com/XAaIsy). Если ваш компилятор не сломан. – juanchopanza

+0

Являются ли MS $ в fish'n'chips («здесь треска с msdn.microsoft.com»)?! - Во всяком случае избегайте друзей на C++. Не очень хорошая идея, так как обычно это вызывает больше проблем, чем стоит –

ответ

1

я просто добавил declaration для class B (так называемых вперед деклараций из class) в верхней части, и он компилирует. Вам необходимо объявить class B, прежде чем использовать его как parameter в member functions от class A.

Вот код ->

#include<iostream> 

class B; 

class A { 
public: 
    int Func1(B& b); 

private: 
    int Func2(B& b); 
}; 

class B { 
private: 
    int _b; 


    // A::Func1 is a friend function to class B 
    // so A::Func1 has access to all members of B 
    friend int A::Func1(B&); 
}; 

int A::Func1(B& b) { return b._b; }//the same error as the one below is here 
//int A::Func2(B& b) { return b._b; } 

int main(void){ return 0; } 

Если ошибка все еще сохраняется, то, возможно, ваш компилятор виноват.

+0

Это называется объявлением _forward_. – aslg

+0

@aslg Я знаю это. –

+0

Хорошо для вас. ОП, или тот, кто читает ваш ответ, может и не знать. (Подсказка: хорошее предложение для редактирования вашего ответа!) – aslg

Смежные вопросы