Nisy 发表于 2010-1-23 00:07:18

友元123

何为友元?
就是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; 方可编译。

rerefrancd 发表于 2010-1-23 02:24:03

页: [1]
查看完整版本: 友元123