2013-10-27 87 views
0

需要幫助從main訪問在Class_D中聲明的函數好友。 指導繼續。訪問好友功能

/* Main.cpp */ 

    #include <iostream> 
    #include "types.h" 
    #include "Class_A.h" 
    #include "Class_C.h" 

    int main() 
    { 
    cout << " Project started" << endl; 
    /* Creating Obj of Class A */ 
    A obj1; 
    /* Accessing Funcition of Class C through A */ 
    obj1.SetFuncA();   
    /* How to access GetFuncD(); from main*/ 
    cin.get(); 
    return 0; 
    } 

/* types.h */ 
#ifndef TYPES_H 
#define TYPES_H 

#include <iostream> 
#include <stdlib.h> 

#define ENAB_FRIEND_CLASS(x) friend class x 

using namespace std; 

typedef unsigned int U32; 
typedef unsigned short U16; 
typedef unsigned char U8; 


typedef int S32; 
typedef short S16; 
typedef char S8; 


#endif 

/* Class_A.h*/ 

#ifndef CLASS_A_H 
#define CLASS_A_H 


class D; 

class A { 
     private : 
     int i; 
     int j;  
     public :     
     A();   /* Default Constructor */                 
     ~A();   /* Default Destructor */                        
     void SetFuncA(); 
     int GetFuncA(); 
     friend int D::FGetFuncD(D &obj); 
     protected:    
     }; 

#endif 

/* Class_D.h */ 
#ifndef CLASS_D_H 
#define CLASS_D_H 

class D { 
     private : 
     int i; 
     int j;  
     public :     
     D();   /* Default Constructor */                 
     ~D();   /* Default Destructor */                        
     void SetFuncD(); 
     int GetFuncD(); 
     void FGetFuncD(D &obj); 
     protected:    
     }; 

void FGetFuncD(D &obj) 
{ 
cout << "\n i " << obj.i << endl;  
cout << "\n i " << obj.j << endl; 
} 


#endif 

/* Class_A.cpp */ 


#include "Class_A.h" 
#include "types.h" 
#include "Class_C.h" 

A :: A() 
{ 
cout << "Default CTOR Called\n" << endl;  
} 

A :: ~A() 
{ 
cout << "Default DTOR Called\n" << endl;  
} 

void A::SetFuncA() 
{ 
    int ret = 0; 
    cout << "\n SetFuncA " << endl; 

    /* Creating Object of class C in Class A*/ 
    C Obj2; 

    /* Setting Private members */ 
    Obj2.SetFuncC(); 

    /* Calling Function of class C in Class A */ 
    ret = Obj2.GetFuncC(); 

    cout << " M = " << ret << endl; 

    /* Dynamically Allocate memory for Class C */ 
    C *ptr = new C(); 

    /* Accessing private members of Class C */ 
    ptr->m =20; 

    /* Accessing Public Function of Class C*/ 
    ret = ptr->GetFuncC(); 

    cout << " M = " << ret << endl; 

    /* Accessing Enum */ 
    ptr->m_bLEVEL = ptr->KN_LEVEL_1; 

    cout << " ENUM = " << ptr->m_bLEVEL << endl; 



} 


int A::GetFuncA() 
{ 
    cout << "\n GetFuncA " << endl; 
} 


/* Class_D.cpp*/ 

#include "types.h" 
#include "Class_D.h" 

D :: D() 
{ 
cout << "Default CTOR Called\n" << endl;  
} 

D :: ~D() 
{ 
cout << "Default DTOR Called\n" << endl;  
} 

void D::SetFuncD() 
{ 
    cout << "\n SetFuncD " << endl; 
    i = 30; 
} 

int D::GetFuncD() 
{ 
    cout << "\n GetFuncD " << endl; 
    return i; 
} 

請指導我修改需要做的訪問class_d的私人成員與朋友功能。

我想探索朋友功能的功能。 並且我添加了Class_A.cpp/.h Class_D.cpp/.h和main.cpp。

+1

你到底有什麼問題?您使用'D :: GetFuncD'的方式與'A類'相同。包含'class_d.h',創建一個'D'對象,然後調用'GetFuncD'方法。 – greatwolf

回答

1

friend函數是一個函數,它不是類的成員,但可以訪問該類的私有和受保護成員。 所以,你的類d應該改變來自:

public :     
    D();   /* Default Constructor */                 
    ~D();   /* Default Destructor */                        
    void SetFuncD(); 
    int GetFuncD(); 
    void FGetFuncD(D &obj); 

到:

public :     
    D();   /* Default Constructor */                 
    ~D();   /* Default Destructor */                        
    void SetFuncD(); 
    int GetFuncD(); 
    friend void FGetFuncD(D &obj); /* changed to friend function */ 

Here's pretty good documentation for it from Microsoft.

然後,在主,你可以叫FGetFuncD沒有D.

的一個實例化對象
int main() 
{ 
D obj2; 
obj2.SetFuncD(); 
int i_of_obj2 = FGetFuncD(obj2); /*using GetFuncD WITHOUT calling on a D object*/ 
cout << "i_of_obj2: " << i_of_obj2 << endl; 


cin.get(); 
return 0; 
} 

輸出應該是: i_of_obj2:30

+0

嗨!你對成員函數和朋友函數感到困惑。朋友函數在class_D.h文件中聲明。你提到的函數是成員函數。感謝您的關注。 void FGetFuncD(D&obj) { cout <<「\ n i」<< obj.i << endl; cout <<「\ n i」<< obj.j << endl; } –

+0

HI mxdg !!我有一個查詢..當我必須通過d類的對象然後什麼是朋友函數的使用。當我能夠創建對象。我可以使用對象訪問私有成員。我的查詢不是創建類d的對象,然後獲取名爲 –

+0

的朋友函數。對於任何函數,我都詳細說明了如何使它成爲上面的朋友函數。好友功能是讓你可以訪問的東西,即使它不是一個成員函數。您需要任何一種類的實例。 例如,可以使用朋友函數來比較兩個D類對象,以查看他們的i是否具有相同的值。 朋友布爾CompareI(d&OBJ1,d&OBJ2){ 回報(obj1.i == obj2.i) } 如果不是一個朋友的功能,我們將無法訪問我的成員變量。這是否使事情更清楚? – mxdg