当前位置: 首页 > news >正文

C++类模版与友元

全局函数类内实现-直接在类内声明友元即可

全局函数类外实现-需要提前让编译器知道全局函数的存在

#include <iostream>
using namespace std;//通过全局函数来打印Person的信息template<class T1,class T2>
class Person{//全局函数,类内实现friend void printPerson(Person<T1,T2> p){cout << "姓名:" << p.m_Name << " 年龄:" << p.m_Age << endl;}public:Person(T1 name,T2 age){this->m_Name=name;this->m_Age=age;}private:T1 m_Name;T2 m_Age;};
//1.全局函数在类内实现
void test01()
{Person<string,int> p("Tom",20);printPerson(p);
}
int main()
{test01();return 0;
}

你看,其实一开始m_Name和m_Age是一个私有的属性,因为其前面有private关键字,因此前面加上friend,也就是友元的全局函数才能访问这个私有属性。

全局函数在类外实现的时候

#include <iostream>
using namespace std;//通过全局函数来打印Person的信息
template<class T1,class T2>
class Person{//全局函数,类内实现friend void printPerson2(Person<T1,T2> p);// {//     cout << "姓名:" << p.m_Name << " 年龄:" << p.m_Age << endl;// }public:Person(T1 name,T2 age){this->m_Name=name;this->m_Age=age;}private:T1 m_Name;T2 m_Age;};
//1.全局函数在类内实现
// void test01()
// {
//     Person<string,int> p("Tom",20);
//     printPerson(p);
// }
//2.全局函数在类外实现,因为这是一个全局函数,因此其没有必要加作用域
template<class T1,class T2>
void printPerson2(Person<T1,T2> p)
{cout << "类外实现的姓名:" << p.m_Name << " 类外实现的年龄:" << p.m_Age << endl;
}
//全局函数在类外实现的测试
void test02()
{Person<string,int> p("Jerry",28);printPerson2(p);
}
int main()
{test02();return 0;
}

其会出现一个无法解析的错误。

    friend void printPerson2(Person<T1,T2> p);

这是一个普通函数的函数声明。

但是下面这是一个函数模版的实现,因此就导致了这两个不是一个东西。因此我们需要告诉编译器这是一个函数模版的声明。

//2.全局函数在类外实现,因为这是一个全局函数,因此其没有必要加作用域
template<class T1,class T2>
void printPerson2(Person<T1,T2> p)
{cout << "类外实现的姓名:" << p.m_Name << " 类外实现的年龄:" << p.m_Age << endl;
}
#include <iostream>
using namespace std;template<class T1,class T2>
class Person;template<class T1,class T2>
void printPerson2(Person<T1,T2> p)
{cout << "类外实现的姓名:" << p.m_Name << " 类外实现的年龄:" << p.m_Age << endl;
}//通过全局函数来打印Person的信息
template<class T1,class T2>
class Person{//全局函数,类内实现//加空模版的参数列表friend void printPerson2(Person<T1,T2>p){cout << "姓名:" << p.m_Name << " 年龄:" << p.m_Age << endl;}friend void printPerson2<>(Person<T1,T2> p);public:Person(T1 name,T2 age){this->m_Name=name;this->m_Age=age;}private:T1 m_Name;T2 m_Age;};
//1.全局函数在类内实现
// void test01()
// {
//     Person<string,int> p("Tom",20);
//     printPerson(p);
// }
//2.全局函数在类外实现,因为这是一个全局函数,因此其没有必要加作用域
template<class T1,class T2>
void printPerson2(Person<T1,T2>& p)
{cout << "类外实现的姓名:" << p.m_Name << " 类外实现的年龄:" << p.m_Age << endl;
}
//全局函数在类外实现的测试
void test02()
{Person<string,int> p("Jerry",28);printPerson2(p);
}
int main()
{test02();return 0;
}

一般没有特殊需求的话,直接就写全局函数配合类内实现就完事儿了,用法非常简单,而且编译器可以直接识别。

http://www.dtcms.com/a/279381.html

相关文章:

  • 进程、线程、协程
  • windows内核研究(进程与线程-进程结构体EPROCESS)
  • Django基础(一)———创建与启动
  • 【反转链表专题】【LeetCode206.反转链表】【LeetCode25.K个一组翻转链表】【LeetCode234.回文链表】
  • Spring Boot 自带的 JavaMail 集成
  • android Perfetto cpu分析教程及案例
  • 5G 到 6G通信技术的革新在哪里?
  • 腾讯云和火山云优劣势对比
  • 电力协议处理框架C++版(三)
  • CA-IS3082W 隔离485 收发器芯片可能存在硬件BUG
  • LTspic下载,帮助及演示电路
  • sfe_py的应力云图计算与显示step by step
  • 暑期自学嵌入式——Day02(C语言阶段)
  • 揭开图像的秘密:OpenCV直方图入门详解
  • 代数基本定理最简短的证明
  • 对于独热编码余弦相似度结果为0和词向量解决了词之间相似性问题的理解
  • ubuntu之坑(十五)——设备树
  • gRPC和http长轮询
  • 新手向:Python自动化办公批量重命名与整理文件系统
  • Dubbo 学习笔记
  • 谷歌收获成果:OpenAI收购Windsurf计划告吹
  • 工业软件加密锁复制:一场技术与安全的博弈
  • Mybatis05-参数和返回
  • 以太网供电(PoE)电源
  • 编程语言设计目的与侧重点全解析(主流语言深度总结)
  • vue中使用西瓜播放器xgplayer (封装)+xgplayer-hls 播放.m3u8格式视频
  • Spark 单机模式安装与测试全攻略​
  • STM32小实验1--点亮LED
  • # 电脑待机后出现死机不能唤醒怎么解决?
  • 【终极指南】ChatGPT/BERT/DeepSeek分词全解析:从理论到中文实战