飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 1893|回复: 1

[C/C++] 友元123

[复制链接]

该用户从未签到

发表于 2010-1-23 00:07:18 | 显示全部楼层 |阅读模式
何为友元?
就是B类中定义的和A类相关的函数,需在A类中再去声明一下,该声明函数称为友元函数。

//////////////////////////////////////////////////////////////////////////
//  同文件
//////////////////////////////////////////////////////////////////////////

同文件情况一:

class A
{
private:
        int m_a;
public:
        A(){}
        ~A(){}
        friend class B; // 这里做个声明即可
};

class B
{
private:
        int m_b;
public:
        B(){}
        ~B(){}
        int GetData(A& obj)
        {
                return obj.m_a;
        }
};

同文件情况二:

先声明A类,将B类提前,并将友元函数的实现放在A类之后。

class A;

class B
{
private:
        int m_b;
public:
        B(){}
        ~B(){}
        int GetData(A& obj);
};

class A
{
private:
        int m_a;
public:
        A(){}
        ~A(){}
        friend int B::GetData(A& obj);
        // 若不含类前缀就成全局函数的友元了
        // 在A类中,再去声明一下调用自身私有成员的函数,权当备案上户口。
};

int B::GetData(A& obj)
{
        return obj.m_a;
}

//////////////////////////////////////////////////////////////////////////
//  不同文件
//////////////////////////////////////////////////////////////////////////

先编译 A类 还是 B类

我先从A类(a.cpp)入手,就挂了搞不定;
然后先从B类入手,发现(b.h)文件中找不到 a 类型,需要声明 class a 类型,
继续编译 b.cpp 中用到了class a 类中的成员,所以b.cpp 中需再包含a.cpp文件。
于是搞定b.cpp文件的编译。
继续看a.cpp文件的编译
编译时发现找不到b类中的该函数,于是在a.h中包含b.h的头文件,遂搞定编译问题。

即 学生选课,学生B,课程A,Student::GetCourse(Course & obj)
b.h 中向前声明 class a;
b.cpp 中包含 #include "a.h"
a.h 中 #include "b.h"

如果先从A类入手,则必须在类中首先声明其为友元类friend class Student; 方可编译。
PYG19周年生日快乐!

该用户从未签到

发表于 2010-1-23 02:24:03 | 显示全部楼层
提示: 该帖被管理员或版主屏蔽
PYG19周年生日快乐!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表