全局函数做类模板中的友元

C++——详解类模板与友元函数 模板类的友元函数有三类: 1)非模板友元函数:友元函数不是模板函数,而是利用模板类参数生成的函数。2)约束模板友元函数:模板类实例化时,每个实例化的类对应一个友元函数。 3)非约束模板友元函数:模板类实例化时,如果实例化了n个类,也会实例化n个友元函数,每个实例化的类都拥有n个友元函数。 阅读详情

1.全局函数类内实现

直接在类内部实现全局函数,然后再前面加上friend关键字即可,简单好用

此处需要传入对象做函数参数,有3中传入参数的方式:

  1. 指定传入类型--直接显式指定对象的数据类型
  2. 参数模板化--将对象中的参数变为模板传入
  3. 整个类模板化--将这个对象模型 模板化进行传递

类模板中对象做函数参数例子参考这个http://t.csdn.cn/gfodS

此处用到参数模板化传入

#include <iostream>
using namespace std;
#include <string>

//类模板与友元
template <class T1,class T2>
class Person
{
	//全局函数类内实现
	friend void showInfo2(Person<T1, T2> p) //参数模板化传入
	{
		cout << "类内实现" << endl;
		cout << "姓名: " << p.m_Name << endl;
		cout << "年龄: " << p.m_Age << endl;
	}

public:
	Person(T1 name, T2 age);

private:
	T1 m_Name;
	T2 m_Age;
};

template <class T1,class T2>
Person<T1, T2>::Person(T1 name, T2 age)
{
	this->m_Name = name;
	this->m_Age = age;
}

void test01()
{
	Person<string, int>p1("Tom", 18);
	showInfo2(p1);
}

int main()
{
	test01();

	system("pause");
	return 0;
}

2.全局函数类外实现

这里用到两种对象做参数的传入方式

  • (1)参数模板化
    #include <iostream>
    using namespace std;
    #include <string>
    
    /*-----------------------类外实现-----------------------*/
    template <class T1, class T2> //类调用的前置声明
    class Person;
    
    //全局函数打印类模板中的私有属性-需要作为友元访问其私有属性
    template <class T1, class T2>
    void showInfo1(Person<T1, T2> p)
    {
    	cout << "类外实现" << endl;
    	cout << "姓名: " << p.m_Name << endl;
    	cout << "年龄: " << p.m_Age << endl;
    }
    /*-----------------------类外实现-----------------------*/
    
    //类模板与友元
    template <class T1,class T2>
    class Person
    {
    	//全局函数类外实现
    	friend void showInfo1<>(Person<T1,T2> p); //空参数列表表示是函数模板
    public:
    	Person(T1 name, T2 age);
    
    private:
    	T1 m_Name;
    	T2 m_Age;
    };
    
    template <class T1,class T2>
    Person<T1, T2>::Person(T1 name, T2 age)
    {
    	this->m_Name = name;
    	this->m_Age = age;
    }
    
    void test01()
    {
    	Person<string, int>p1("Tom", 18);
    	showInfo1(p1);
    }
    
    int main()
    {
    	test01();
    
    	system("pause");
    	return 0;
    }

    由于全局函数是类外实现,此时需要让编译器提前知道这个函数的存在,故把全局函数的定义提前到类定义的前面;但是由于全局函数中的参数是下面定义的类,所以要把类声明提前到全局函数的定义之前

  • (2)整个类模板化
    #include <iostream>
    using namespace std;
    #include <string>
    
    //类模板与友元
    template <class T1, class T2>
    class Person1
    {
    	//全局函数类外实现-类模板化传入
    	template <class T>
    	friend void showInfo(T& p); //友元全局函数的声明
    public:
    	Person1(T1 name, T2 age);
    
    private:
    	T1 m_Name;
    	T2 m_Age;
    };
    
    //构造函数类外实现
    template <class T1, class T2>
    Person1<T1, T2>::Person1(T1 name, T2 age)
    {
    	this->m_Name = name;
    	this->m_Age = age;
    }
    
    template <class T>
    void showInfo(T& p)
    {
    	cout << p.m_Name << endl;
    	cout << p.m_Age << endl;
    }
    
    void test10()
    {
    	Person1<string, int>p1("Tom", 18);
    	showInfo(p1);
    }
    
    int main()
    {
    	test10();
    
    	system("pause");
    	return 0;
    }

【人工智能AI】是什么? 人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟延伸和扩展人的智能的理论方法技术及应用系统的一门新的技术科学。(百度百科)人工智能的基本原理:机器从「特定的」大量数据中总结规律,形成某些「特定的知识」,然后将这种「知识」应用到现实场景中去解决实际问题。在这个基本原理的基础上,有3个特征:1、人工智能本质上是一种工具2、人工智能技能只能解决特定的问题,而不是什么都能做3、人工智能属于归纳逻辑,可以告诉你是什么,但是不能告诉你为什么。 阅读详情

相关推荐

Camera ITS测试

一、手机端设置: 将 CtsVerifier.apk 安装到设备上, 连接上linux主机。 二、主机端设置: 基础:CTS测试运行环境 然后,主机安装python2.7,及numpy/scipy/matplotlib/opencv 栈和 python 成像库。按照下面的命令依次安装: sudo apt­-get install python-­numpy sudo apt-­g...

wangubuntu的专栏 7784

C++ 学习之类模板与友元 (全局函数类内、类外实现)

全局函数类内实现 - 直接在类内声明友元即可(比较简单) 全局函数类外实现 - 需要提前让编译器知道全局函数的存在(复杂了) 1、全局函数类内实现: #include<iostream> #include<string> using namespace std; template<class T1, class T2> class Person { //1、全局函数配合友元类内实现 friend void ShowPerson(Person<T1,..

阿乐的博客 2355

别再踩坑了!手把手教你用EB Tresos Studio创建Autosar MCAL工程(含模块配置避坑指南)

本文详细介绍了使用EB Tresos Studio创建Autosar MCAL工程的完整流程,包括工程创建前的关键准备、模块配置的避坑指南以及工程验证与代码生成的实用技巧。通过实战案例和黄金准则,帮助开发者高效完成MCAL工程创建,避免常见错误,提升开发效率。

weixin_42536058的博客 444

c++提高编程---类模板

1、类模板语法 类模板作用:建立一个通用类,类中的成员 数据类型可以不具体制定,用一个虚拟的类型来代表 template<typename T> 类 解释: template :声明创建模板 typename :表明其后面是一种数据类型,可以用class代替 T:通用的数据类型,名称可以替换,通常大写字母 //类模板 template<class NameT, class AgeT> class person { public: NameT m_name;

m0_50046535的博客 825

Ubuntu22.04安装ROS1

代表使用 2 线程进行编译,可以根据 CPU 适当调整。如果出现小乌龟窗口,说明安装成功 🎉!启动成功,则打开另一个终端,测试。需要解决一些兼容性问题,因为。由于 Ubuntu 22.04。过程,确保成功安装。

asafriend的博客 4646

開機自動進入UEFI Interactive Shell無法正常開機怎麼辦?

BIOS/UEFI,啟動後進入UEFI Interactive Shell大多數人都告訴你沒有安裝系統去裝系統吧,但你明明昨天還在運行系統?今天就這樣?有沒有解決辦法?

sheaahhoi1的博客 7740

全局函数类内和类外实现

积少成多

SZYLQJ的博客 5328

学习Fidder主要掌握的技术——流量篡改

本文介绍了Fiddler工具的三种常用调试方法:1)本地映射-通过保存修改JSON响应文件实现接口数据模拟;2)Composer接口调试-通过修改请求参数快速测试接口异常处理;3)断点调试-在请求/响应过程中拦截并修改数据。这三种方法分别适用于前端开发、接口测试和健壮性验证等场景,能够有效提高调试效率。操作步骤包括保存响应、修改数据、配置规则等关键环节,并提供了详细的界面操作指引。

2301_79022773的博客 353

C++类模板使用友元实现类内全局函数和类外全局函数

【代码】C++友元与类模板。

分享计算机视觉,C++,网络摄像头研发,音视频开发,嵌入式等知识。 996

高速特征金字塔多角度旋转模板匹配(工业零部件缺陷检测C++ Opencv版)

博主在性能较好的笔记本上测试算法全部执行效果大约为45ms,在一般配置的笔记本上博主在性能较好的笔记本上测试算法全部执行效果大约为130ms。下图即为实际检测效果。本文最后附有完整代码:Qt版和MFC版本(可直接运行)。...

认真努力,做一只会飞的毛毛虫。 5547

强化学习(Reinforcement Learning)与动态系统控制方法

一个具体的 RBC 的例子是自动驾驶汽车中的交通规则。在训练过程中,代理通过与环境交互获取奖励信号,并学习如何在某个状态下采取最佳的行动,以最大化长期的累积奖励。在化工过程中,通过对生产过程中的温度、压力、流量等参数的控制来实现产品的质量和产量的提高。需要注意的是,以上代码只是一个简单的示例,实际的 MPC 系统可能会更加复杂,并包含更多的模型预测和控制算法来实现更复杂的控制任务。需要注意的是,以上代码只是一个简单的示例,实际的自动驾驶汽车系统可能会更加复杂,并包含更多的规则和条件来确保安全行驶。

AI天才研究院 4062

c++全局函数类内实现

全局函数类内实现和类外实现的区别就在于,类外实现要提前声明,让编译器知道。 类内实现可直接friend即可。

qq_35901266的博客 1699

网络安全与黑客攻防常见设备:前置机、跳板机、堡垒机与肉鸡

前置机、跳板机、堡垒机和肉鸡,这些看似冷僻的技术名词,实则是网络安全与黑客攻防战中的关键角色。它们有的守护着企业的数字Pltform,保卫网络安全;有的则成为黑客的跳板,游走于灰色地带。

网络技术联盟站 962

C++函数、类、类的成员函数作为 类模板的友元 实例

//program 18.5.1.cpp 函数、类、类的成员函数作为 类模板的友元 #include<iostream> using namespace std; template <class T> class Tmpl; template <class T> void Func1(Tmpl<T> &x) { cout << "this is a global function :Func1()" << endl&l

xuchaoxin1375的博客 303

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

模板————类模板(二)

类模板的作用: 建立一个通用模板,类中的成员、数据类型可以不具体制定,用一个虚拟的类型来代表; 模板类的语法: 类模板: template<class name,class age>//语法 class person{ public: person(name m_name,age m_age){ this->name = "xiaoming"; this->age = 12; } name m_...

weixin_43961989的博客 185

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

类外全局函数

cout << "姓名为" << p.m_name << "年龄为" << p.m_age << endl;person<string, int>p("张三", 10);

hym923的博客 363

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C++Stu0320

#include <iostream> using namespace std; #include <string> //模板 //函数模板 void swapint(int& a, int& b) { int temp = a; a = b; b = temp; } template<typename T>//声明创建模板 void myswap(T& a, T& b) { T temp = a; .

weixin_47123165的博客 1072

类模板中的友元,友元函数

一:让函数模板的某个实例成为友元函数 #include <iostream> #include <vector> using namespace std; #pragma warning(disable : 4996) template <typename T> void func(); //声明不可少 class A { friend void func<int>(); private: void fun() { cout << "

qq_38158479的博客 465

C++类模板与友元 类模板与友元 友元和类模板

C++类模板与友元 类模板与友元 友元和类模板 学习目标: 掌握类模板配合友元函数的类内和类外实现 全局函数类内实现 - 直接在类内声明友元即可 全局函数类外实现 - 需要提前让编译器知道全局函数的存在 #include <iostream> #include <string> using namespace std; //提前要进行声明类 //2.全局函数配合友元 类外实现 - 先做函数模板声明,下方在做函数模板定义,在做友元 template<class T1, cl

qq_36711295的博客 513

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

模板类友元函数 模板类的友元函数 参考:https://blog.youkuaiyun.com/dreamer_lhs/article/details/53580088 区分:友元是否为函数模板 非模板友元 约束(bound) 模板友元,友元类型取决于模板类被实例化的类型,一个实例化模板函数 非约束(unbound) 模板友元,友元函数模板类型不同于类模板类型,一个通用型函数模板 非模板友元 友元函数不是一个模板函数 template<typename T> class HasFriend {

njust_cse_17_wc的博客 4695

【模板友元设计必知】:从基础到精通,6种经典场景下的声明实践

掌握模板友元的声明方式,解决类与函数模板间的访问难题。详解6种典型场景下的实现方法,涵盖非模板函数、类模板及成员函数友元,提升代码灵活性与复用性。深入解析语法要点与常见误区,值得收藏。

PixelWander的博客 476

全局函数类外实现 类模板 友元

#include<iostream> #include<string> using namespace std; //template<class T1,class T2> //class Person; template<class T1,class T2> class Person { template<class T1,class T2> friend void printPerson(Person<T1, T2>&a.

qq_40786884的博客 217

C++类模板->类模板语法、类模板与函数模板区别、类模板中成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元

cout << "类外实现 ---- 姓名: " << p.m_Name << " 年龄:" << p.m_Age << endl;cout << "姓名: " << this->m_Name << " 年龄:" << this->m_Age << endl;cout << "姓名: " << this->m_Name << " 年龄:" << this->m_Age << endl;cout << "姓名: " << p.m_Name << " 年龄:" << p.m_Age << endl;

鲸鱼的博客 790

C++类模板与友元介绍

C++ 的类模板和友元(friend)结合使用,可以实现灵活的访问控制。在类模板中,友元的定义和使用比普通类更复杂,因为模板涉及类型参数,友元关系需要根据具体的实例来确定。

weixin_45613635的博客 1207

类模板中的友元函数的定义

类模板和友元简介: 当一个类被包含一个友元声明的时候,类和友元是否是模板是相互无关的。 如果一个类模板包含一个非模板友元,则友元被授权可以访问所有模板实例; 如果友元自身是模板,类可以授权给所有友元模板实例,也可以之授权给特定实例。 一、友元和类模板的一对一关系: 类模板与另一个(类或函数)模板间友好关系的最常见的形式是: 建立对应实例及其友元间的友好关系。 例如: //前置声明,在Blob中声明友元所需要的 template<typename T> class BlobPtr; templat

huxxyyy的博客 665

模板友元不会用?3分钟彻底搞懂所有声明语法,别再写错了!

快速掌握模板友元的声明方式,解决C++中类与函数模板的访问难题。涵盖常见适用场景、三种核心声明语法及注意事项,助你写出正确高效的代码。语法清晰,避免常见错误,值得收藏。

PixelShoal的博客 334
上一篇: 以对象为函数参数的函数模板
下一篇: 类模板中对象做函数参数
你不是猫
博客等级 码龄4年 30粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值