2013-10-27 8 views
0

Нужна помощь в доступе к другу функции, объявленному в 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 с функцией friend.

Я пытаюсь изучить функцию функции друга. И я добавил Class_A.cpp/.h Class_D.cpp/.h и main.cpp.

+1

Какие у вас проблемы? Вы используете 'D :: GetFuncD' так же, как и для класса А. Включите 'class_d.h', создайте объект' D', затем вызовите метод 'GetFuncD' для него. – greatwolf

ответ

1

Функция друга - это функция, которая не является членом класса, но имеет доступ к закрытым и защищенным членам класса. Итак, ваш класс 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

привет! u запутался с функцией-членом и функцией друга. функция friend объявляется в файле class_D.h. функция u refer является элементом fucntion. Спасибо за ваш интерес. void FGetFuncD (D & obj) { cout << "\ n i" << obj.i << endl; cout << "\ n i" << obj.j << endl; } –

+0

HI mxdg !! У меня есть запрос .. когда мне нужно передать объект класса d, то зачем использовать функцию друга. когда я могу создать объект. Я могу получить доступ к частному члену, используя объект. Мой запрос состоит не в том, чтобы создать объект класса d, а затем получить функцию друга, которая называется –

+0

. Для любой функции я подробно рассказал, как сделать ее функцией для друзей выше. Функция friend - это то, что вы можете получить доступ к вещам, даже если это НЕ функция-член. Вам нужен экземпляр класса в любом случае. Функции друга могут использоваться, например, для сравнения двух объектов класса D, чтобы увидеть, являются ли их значения i одинаковыми. друга BOOL CompareI (D & obj1, D & obj2) { возвращение (obj1.i == obj2.i) } Если это не функция друг, мы не смогли бы получить доступ к переменным-членам я. Разве это становится понятным? – mxdg

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

  • Нет связанных вопросов^_^