2013-06-26 3 views
1
#include <iostream> 
using namespace std; 

class CBase 
{ 
    public: 
    int a; 
    int b; 
    private: 
    int c; 
    int d; 
    protected: 
    int e; 
    int f; 
    //friend int cout1(); 
}; 

class CDerived : public CBase 
{ 
    public: 
    friend class CBase; 
    int cout1() 
    { 
     cout << "a" << endl; 
     cin >> a; 
     cout << "b" << endl; 
     cin >> b; 
     cout << "c" << endl; 
     cin >> c; 
     cout << "d" << endl; 
     cin >> d; 
     cout << "e" << endl; 
     cin >> e; 
     cout << "f" << endl; 
     cin >> f; 
     cout << a << "" << b << "" << c << "" << d << "" << e << "" << f << "" << endl; 
    } 
}; 

int main() 
{ 
    CDerived chi; 
    chi.cout1(); 
} 

Как использовать класс друга и функцию друга? Пожалуйста, помогите мне. У меня есть много подобных ошибок:Как использовать функцию друга или класс друга?

c6.cpp: In member function int CDerived::cout1(): 
c6.cpp:10: error: int CBase::c is private 
c6.cpp:30: error: within this context 
    c6.cpp:11: error: int CBase::d is private 
c6.cpp:32: error: within this context 
    c6.cpp:10: error: int CBase::c is private 
c6.cpp:37: error: within this context 
    c6.cpp:11: error: int CBase::d is private 
c6.cpp:37: error: within this context 

ответ

4

CDerived не могут получить доступ к частным лицам CBase. Неважно, если вы сделаете его другом или нет. Если вы хотите, чтобы такой доступ разрешался, вы должны сделать CBase объявить дружеские отношения.

#include <iostream> 
    using namespace std; 

    class CDerived; // Forward declaration of CDerived so that CBase knows that CDerived exists 

    class CBase 
    { 
    public: 
     int a; 
     int b; 
    private: 
     int c; 
     int d; 
    protected: 
     int e; 
     int f; 

     friend class CDerived; // This is where CBase gives permission to CDerived to access all it's members 
}; 

class CDerived : public CBase 
{ 

public: 
void cout1() 
{ 
     cout<<"a"<<endl; 
     cin>>a; 
     cout<<"b"<<endl; 
     cin>>b; 
     cout<<"c"<<endl; 
     cin>>c; 
     cout<<"d"<<endl; 
     cin>>d; 
     cout<<"e"<<endl; 
     cin>>e; 
     cout<<"f"<<endl; 
     cin>>f; 
     cout<<a<<""<<b<<""<<c<<""<<d<<""<<e<<""<<f<<""<<endl; 
    } 
}; 

int main() 
{ 
    CDerived chi; 
    chi.cout1(); 
} 
+0

Вам нужно будет заставить cout1 возвращать что-то тоже, чтобы его скомпилировать – doctorlove

+0

Спасибо, еще один пример того, почему вы не должны просто копировать-вставлять. (Пришло время узнать, что урок) – RobbieE

+0

большое спасибо. .показать, пожалуйста, помощь с другом-членом fuc. , – brownKnight

1

Лучшее решение для Вас, чтобы сделать поля, доступ из базового класса защищенного, а не частные. Тем не менее, если вы хотите использовать friend, вы должны сделать CDerived класс друга классу CBase.

+0

Обратите внимание, что нет возможности сделать 'CDerived :: cout1' другом' CBase'; это приведет к взаимной зависимости от определений. – Angew

+0

@ Ангелое истинное. Я удалю это –

1

Когда вы говорите

class CDerived : public CBase 
{ 

    public: 
    friend class CBase; 

Это означает, что CBase имеет доступ к закрытым членам CDerived «s, а не наоборот. В зависимости от вашего дизайна, возможно, лучше сделать этих членов protected. Еще вам нужно объявить CDerived в качестве друга CBase.

0

Когда Вы пишете

friend class CBase; 

это означает, что CBase может получить доступ к частным методам CDerived. Что Вы хотите сделать здесь, чтобы написать

friend class CDerived 

в CBase, так CDerived может использовать частные методы CBase

0

Если вы хотите класс B обходить инкапсуляцию класса A, то A должен объявить B, как a friend, а не наоборот.