20240428,类模板(继承,成员函数类外实现,份文件编写)

笑死,被设计中伤的又一个人,RIBEN相机打八折了,可是我兜里没钱哭死

目录

0.4 类模板与继承

0.5 类模板成员函数类外实现

0.6 类模板份文件编写

1,直接包含CPP源文件

person.h

person.cpp

a.cpp

2,将声明和实现写到同一个文件中,并更改后缀名为HPP

person.hpp

a.c

0.7 类模板与友元

完蛋了,又是没学习的一天
​​​​​​​

0.4 类模板与继承

当子类继承的是父类的一个类模板时,子类在声明的时候,要制定出父类中的T的类型
如果不指定,编译器无法给子类分配内存
如果想灵活制定出父类中的T的类型,子类也需变为类模板

#include<iostream>
#include<string>
using namespace std;
template<class T>
class Base {
public:
	T m;
	Base() {
		cout << "base T的数据类型是\t" << typeid(T).name() << endl;
	}
};
//class Son:public Base { }; //无法继承,确实BASE的参数列表--必须知道父类的T的数据类型
class Son :public Base<int> {
	
};
template<class T1,class T2>
class Son2 :public Base<T2> {
public:
	Son2() {
		cout << "son2 T1的数据类型是\t" << typeid(T1).name() << endl;
		cout << "son2 T2的数据类型是\t" << typeid(T2).name() << endl;
	}
	T1 obj;
};

void test01() {
	Son s1;
	Son2<int, char>s2;//int传给T1,char传给T2传给BASE的T
}
int main() {
	test01();
	system("pause");
	return 0;
}
0.5 类模板成员函数类外实现

 需要加上模板参数列表

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

template<class T1,class T2>
class Person{
public:
	Person(T1 name, T2 age);
	/*{
		this->_name = name;
		this->_age = age;
	}*/
	void show();
	//{
	//	cout << "name:\t" << this->_name >> "\tage:" << this->_age << endl;
	//}
	T1 _name;
	T2 _age;
};
//构造函数类外实现
template<class T1, class T2>
Person<T1, T2>::Person(T1 name, T2 age) { //加作用域 + 指定传入<T1,T2>
	this->_name = name;
	this->_age = age;
}
//成员函数类外实现
template<class T1, class T2>
void Person<T1, T2>::show() {
	cout << "name:\t" << this->_name<< "\tage:" << this->_age << endl;
}

void test01() {
	Person<string, int> pp("土豆", 2);
	pp.show();
}
int main() {
	test01();
	system("pause");
	return 0;
}
0.6 类模板份文件编写

问题:类模板中成员函数的创建时机是在调用阶段,导致文件分文件编写是链接不到
解决:1,直接包含CPP源文件
2,将声明和实现写到同一个文件中,并更改后缀名为HPP,HPP是约定的名称,并不是强制

1,直接包含CPP源文件
person.h
#pragma once
#include<iostream>
#include<string>
using namespace std;

template<class T1, class T2>
class Person {
public:
	Person(T1 name, T2 age);
	void show();
	T1 _name;
	T2 _age;
};
person.cpp
#include "person.h"

template<class T1, class T2>
Person<T1, T2>::Person(T1 name, T2 age) { //加作用域 + 指定传入<T1,T2>
	this->_name = name;
	this->_age = age;
}
template<class T1, class T2>
void Person<T1, T2>::show() {
	cout << "name:\t" << this->_name << "\tage:" << this->_age << endl;
}
a.cpp
#include<iostream>
#include<string>
//#include "person.h"//可以省略,但是这种办法本身不常用
#include "person.cpp"
using namespace std;


void test01() {
	Person<string, int> pp("土豆", 2);
	pp.show();
}
int main() {
	test01();
	system("pause");
	return 0;
}
2,将声明和实现写到同一个文件中,并更改后缀名为HPP
person.hpp
#include<iostream>
#include<string>
using namespace std;

template<class T1, class T2>
class Person {
public:
	Person(T1 name, T2 age);
	void show();
	T1 _name;
	T2 _age;
};

template<class T1, class T2>
Person<T1, T2>::Person(T1 name, T2 age) { //加作用域 + 指定传入<T1,T2>
	this->_name = name;
	this->_age = age;
}
template<class T1, class T2>
void Person<T1, T2>::show() {
	cout << "name:\t" << this->_name << "\tage:" << this->_age << endl;
}
a.c
#include<iostream>
#include<string>
#include "person.hpp"
using namespace std;


void test01() {
	Person<string, int> pp("土豆", 2);
	pp.show();
}
int main() {
	test01();
	system("pause");
	return 0;
}
0.7 类模板与友元

类模板配合友元函数的类内,类外实现:
类内:直接在类内声明友元即可
类外:需要提前让编译器知道全局函数的存在——麻烦

#include<iostream>
#include<string>
//#include "person.hpp"
using namespace std;

template<class T1, class T2>
class Person;//看到PRINT02时编译器要知道有PERSON类
//类外实现,
template<class T1, class T2>//模板函数
void print02(Person<T1, T2> p) {
	cout << "name:\t" << p._name << "\tage:" << p._age << endl;
}
template<class T1, class T2>
class Person {
	//全局函数类内实现
	friend void printperson(Person<T1,T2> p) {
		cout << "name:\t" << p._name << "\tage:" << p._age << endl;
	}
	//全局函数类wai实现----加空模板参数列表,需要让编译器提前知道这个函数存在
	friend void print02<>(Person<T1, T2> p);
public:
	Person(T1 name, T2 age) {
		this->_name = name;
		this->_age = age;
	}
	void show();
private:
	T1 _name;
	T2 _age;
};

void test01() {
	Person<string, int> pp("土豆", 2);
	printperson(pp);
	print02<>(pp);
}
int main() {
	test01();
	system("pause");
	return 0;
}
完蛋了,又是没学习的一天

相关推荐

  1. 模板继承成员、全局函数实现

    2024-04-29 20:34:02       81 阅读
  2. 模板文件编写

    2024-04-29 20:34:02       40 阅读
  3. 模板文件编写

    2024-04-29 20:34:02       46 阅读
  4. 的声明与成员函数实现--Car

    2024-04-29 20:34:02       36 阅读
  5. 成员函数

    2024-04-29 20:34:02       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-29 20:34:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-29 20:34:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-29 20:34:02       82 阅读
  4. Python语言-面向对象

    2024-04-29 20:34:02       91 阅读

热门阅读

  1. 深入浅出MySQL-05-【OPTIMIZE TABLE】

    2024-04-29 20:34:02       32 阅读
  2. 去中心化自治组织(DAO)

    2024-04-29 20:34:02       30 阅读
  3. Linux 中根据关键字查找某一文件

    2024-04-29 20:34:02       33 阅读
  4. 养老金融:编织中国老龄社会的金色安全网

    2024-04-29 20:34:02       37 阅读
  5. 你不知道的CSS链接:解锁网页导航的秘密武器

    2024-04-29 20:34:02       26 阅读