友元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; 方可编译。
页:
[1]