gpt4 book ai didi

c++ - 访问好友功能

转载 作者:行者123 更新时间:2023-11-28 07:20:07 25 4
gpt4 key购买 nike

在从 main 访问 Class_D 中声明的函数 friend 时需要帮助。指导进行。

    /* 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 的私有(private)成员。

我正在尝试探索好友功能的特性。我添加了 Class_A.cpp/.h Class_D.cpp/.h 和 main.cpp。

最佳答案

友元函数是不是类成员但可以访问类的私有(private)和 protected 成员的函数。所以,你的 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.

然后,在 main 中,您可以只调用 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

关于c++ - 访问好友功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19619230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com