×错误代码:被友的(Service)写在后面

#include <iostream>
#include <sstream>
using namespace std;class Computer {///啊啊啊我不认识Service啊怎么能和不认识的人交朋友呢???
public:Computer(string cpu = "") {this->cpu = cpu;}string description() {stringstream ret;ret << "cpu:" << cpu << endl;return ret.str();}private:string cpu;friend void upgrade(Computer* computer) {//友元函数不分public和private,因为无论写哪外部都可以调用computer->cpu = "i9";}//要声明可以对自己进行改变的其他类的成员函数friend void Service::up(Computer* computer, string version);
};class Service {//嘿我在这儿呢,你咋看不到呢?
public:Service() {}void up(Computer* computer, string version);//友元函数不分public和private,因为无论写哪外部都可以调用};void Service::up(Computer* computer, string version)
{**computer->cpu = version;**
}int main() {Computer computer("i7");cout << computer.description();upgrade(&computer);cout << computer.description();Service service;service.up(&computer, "i8");cout << computer.description();
}

Computer表示自己背后没有眼睛,于是大家记得既然是他的朋友要记得放在它的前面!(不然…就会像我一样找错30min+感觉眼睛要…要找…不到了…)
错误提示如下:

(生成前鼠标划到红色波浪线处不会提示第一行的错误导致我苦苦求索…)

√正确代码:被友的(Service)写在前面!!

#include <iostream>
#include <sstream>
using namespace std;class Service {//站这么前你可看到了吧?!
public:Service() {}void up(Computer* computer, string version);//友元函数不分public和private,因为无论写哪外部都可以调用};class Computer {//那你可当,当然看到了哇真是的!
public:Computer(string cpu = "") {this->cpu = cpu;}string description() {stringstream ret;ret << "cpu:" << cpu << endl;return ret.str();}private:string cpu;friend void upgrade(Computer* computer) {//友元函数不分public和private,因为无论写哪外部都可以调用computer->cpu = "i9";}//要声明可以对自己进行改变的其他类的成员函数friend void Service::up(Computer* computer, string version);
};void Service::up(Computer* computer, string version)
{**computer->cpu = version;**
}int main() {Computer computer("i7");cout << computer.description();upgrade(&computer);cout << computer.description();Service service;service.up(&computer, "i8");cout << computer.description();
}

总结:

1.看生成后,完整的错误提示
2.被友的函数所在类写前边儿
3.如果分割开到.cpp .h: 被友的.h写友的class,被友的.cpp写友的.h,友的.h写被友的.h
4.如果晕了,多试试就好,没红线能编译成就行
如果点3就想看明白的不想自己试明白的见下:

#pragma once
#include <iostream>
#include <sstream>
using namespace std;
#include "Service.h"class Computer {public:Computer(string cpu = "") {this->cpu = cpu;}string description();private:string cpu;friend void upgrade(Computer* computer);//友元函数不分public和private,因为无论写哪外部都可以调用//要声明可以对自己进行改变的其他类的成员函数friend void Service::up(Computer* computer, string version);//对这个函数的声明必须写在前面,才能知道是要把这个函数当朋友
};
//总结:他类:service具体实现需要包括header以得知内部成员,declare class就行没修改内部成员;computer declare需要包括header看清friend的函数;main中只写computer就行因为都含了
//外部函数:     main中包括friend的header(这点没啥特别,要用它肯定要包含它)

友的cpp:

#include "Computer.h"string Computer::description()
{stringstream ret;ret << "cpu:" << cpu << endl;return ret.str();
}void upgrade(Computer* computer)
{computer->cpu = "i9";
}

被友的.h:

#pragma once
using namespace std;
#include <string>
class Computer;
class Service {public:Service() {}void up(Computer* computer, string version);//友元函数不分public和private,因为无论写哪外部都可以调用};

被友的.cpp

#include "Service.h"
#include "Computer.h"//包含才能知道是它的朋友可以访问它
void Service::up(Computer* computer, string version)
{computer->cpu = version;
}

结束~最后谢谢我的小伙伴龙桑帮我研究出来问题所在!

解决【C++】其他类中友元函数不可访问私有数据--顺序问题相关推荐

  1. 友元函数可以访问私有成员吗_C++的友元函数和友元类

    C++使用类对数据进行隐藏和封装,类的数据成员一般定义为私有成员,而将提供类与外界通讯接口的成员函数定义为公有的. C++类成员的三种访问权限: public:可以被该类中的函数.子类的函数.友元函数 ...

  2. 学习笔记-----C++模板类中友元函数重载输出运算符时提示无法解析的外部符号解决方案

    今天在写单向链表实现线性表的时候打算重载输出运算符用来将线性表输出,结果无奈又遇到了问题. 大致代码如下 <pre name="code" class="cpp&q ...

  3. 3第一周课后练习#183;阅读计划(3)-使用函数来访问私有数据成员

    /** Copyright (c) 2015, 计算机科学学院,烟台大学* All rights reserved.* 文件名:test.cpp* 作 靠:刘畅* 完成日期:2015年 3 一个月 2 ...

  4. java有没有友元函数_c++中友元函数理解与使用

    在学习c++这一块,关于友元函数和友元类,感觉还是不好理解,但是井下心来,理解,需要把我一下几点. 首先讲友元函数. (1)友元函数: 1)C++中引入友元函数,是为在该类中提供一个对外(除了他自己意 ...

  5. C++中友元函数和友元类

    友元函数 友元函数是可以直接访问类的私有成员的非成员函数.它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下: frien ...

  6. C++ 类模板中友元函数问题

    #pragma once #include<iostream> template<typename T> class TestFriendTemplate { public:/ ...

  7. 【C++ 基础篇:21】:friend 友元四连问:什么是友元?友元类?友元函数?什么时候用友元?

    本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段:基础篇.STL 篇.高阶数据结构与算法篇,相关重点内容如下: 基础篇:类与对象(涉及C++的三大特 ...

  8. c++中友元函数详解

    友元 友元分为:友元函数和友元类 友元提供了一种突破封装的方式,有时提供了便利.但是友元会增加耦合度,破坏了封装,所以友元不宜多 用. 全局函数做友元函数 全局函数写到类中做声明 并且最前面写关键字 ...

  9. 运算符重载为类的友元函数

    运算符重载为类的友元函数 友元函数通过类的对象可以访问类的公有.保护和私有成员,也就是类的所有成员友元函数都能访问到.所以运算符重载为类的友元函数以后也可以访问类的所有成员. 与运算符重载为成员函数时 ...

  10. 【C++】模板类的友元函数

    模板类友元函数 模板类的友元函数 参考:https://blog.csdn.net/dreamer_lhs/article/details/53580088 区分:友元是否为函数模板 非模板友元 约束 ...

最新文章

  1. 加州大学戴维斯分校 计算机科学,加州大学戴维斯分校的计算机专业如何?
  2. MySQL基础篇:单行函数
  3. 后盾网lavarel视频项目---1、数据迁移
  4. java开发数据库属于后端吗_JavaWeb后端开发,数据库知识需要掌握到何种程度?...
  5. 树莓派用服务方式设置开机启动
  6. 低功耗蓝牙onscanresult 出来名字为空_浅析BLE5.0蓝牙模块在智能家居的运用
  7. vue组件通信大总结
  8. python中定义一个空的字符串_04python—15种字符串操作
  9. transform用于图像检索
  10. 新一代“土豪专享”机来了!三星W2020通过WiFi联盟认证
  11. python map函数_Python map()函数
  12. php 导出tables,jquery+php实现导出datatables插件数据到excel的方法_php技巧
  13. 配置追踪者—Scylla v1(***测试工具)
  14. Atitit 理解参数 目录 1. 参数 1 1.1. 意义 1 1.2. 形式参数 实际参数 1 1.3. 默认参数 vs 必须参数 2 1.4. 位置参数,那么这个命名关键字参数 2 1.5. I
  15. 【读史笔记】《晋书·卫玠列传》
  16. MongoDB MongoVue 客户端
  17. matlab dynprog,matlab信号处理工具箱
  18. php变量控制结构与函数,LAMP兄弟连原创视频教程(PHP笔记一--变量,流程控制结构,函数)...
  19. 2022年10款好用免费数据恢复软件分享
  20. 塑料划分PP PE PS PA ABS PVC

热门文章

  1. php 网页qq一键登录,给网站添加一键qq登录的功能
  2. Vue Router 路由(路由守卫)---route
  3. Router路由守卫
  4. 程序员的8个职业发展方向,了解一下!
  5. MySQL启动报错: Failed to start LSB start and stop MySQL
  6. linux 安装TeamViewer
  7. 服务器ie浏览器总是未响应怎么办,IE8浏览器总是无响应或卡死崩溃怎么办
  8. 有道云笔记修改主题教程
  9. easyScholar简介
  10. map文件介绍及使用