某个类需要实现某种功能,但是这个类自身,因为各种原因,无法自己实现。需要借助于“外力”才能实现。
友元函数,友元类
使用全局函数作为友元函数[? 全局函数无法访问类的私有成员,要么改变访问权限,要么定义为友元函数?]
使用friend关键字就没有权限限制,,可以放在访问权限的任何位置(public,protected,private)
.h文件中
friend void update(Computer& h);
主函数文件中:
void update(Computer& h) {
?? ?h.cpu = 'i9';//全局函数不能直接访问私有成员,设置为友元
}
?
?.h
#pragma once
#include <string>
#include "ComputerService.h"//光声明是不够的
using namespace std;
class Computer{
public:
string description();
Computer();
friend void ComputerService::update(Computer* computer);
private:
string cpu;
};
#pragma once
class Computer;
class ComputerService
{
public:
void update(Computer* computer);
};
.cpp
computer.cpp
#include "Computer.h"
#include <sstream>
Computer::Computer(){
this->cpu = "i5";
}
string Computer::description()
{
stringstream ret;
ret << "cpu:" << cpu << endl;
return ret.str();
}
computerService.cpp
#include "ComputerService.h"
#include "Computer.h"
void ComputerService::update(Computer* computer)
{
computer->cpu = "i9";
}
主函数
#include "Computer.h"
#include "ComputerService.h"
#include <iostream>
using namespace std;
int main(void) {
Computer h1;
cout << h1.description() << endl;
//使用友元之后
cout << "使用友元外类成员函数之后" << endl;
ComputerService h2;
h2.update(&h1);
cout << h1.description() << endl;
return 0;
}
friend class ComputerService;
friend class ComputerService;
#pragma once
class Computer;
class ComputerService
{
public:
?? ?void update(Computer* computer);
?? ?void clean(Computer* computer);
?? ?void kill(Computer* computer);
};
#include "Computer.h"
void ComputerService::update(Computer* computer)
{
?? ?computer->cpu = "i9";
}
void ComputerService::clean(Computer* computer)
{
?? ?cout << "正在清除"<<computer->cpu << endl;
}
void ComputerService::kill(Computer* computer)
{
?? ?cout << "正在杀毒" <<computer->cpu<< endl;
}
#include "Computer.h"
#include "ComputerService.h"
#include <iostream>
using namespace std;
int main(void) {
?? ?Computer h1;
?? ?cout << h1.description() << endl;
?? ?//使用友元之后
?? ?cout << "使用友元外类成员函数之后" << endl;
?? ?ComputerService h2;
?? ?h2.update(&h1);
?? ?h2.clean(&h1);
?? ?h2.kill(&h1);
?? ?cout << h1.description() << endl;
?? ?return 0;
}