鱼C论坛

 找回密码
 立即注册
查看: 1307|回复: 0

[技术交流] C++旅程第10站——类模板3

[复制链接]
发表于 2020-6-4 21:19:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Luck is what you have left over after you give 100 percent.

类模板成员函数类外实现
#include<iostream>
#include<string>

using namespace std;

template<class T1,class T2>
class Student
{
        public:
                T1 m_name;
                T2 m_num;
                
                //成员函数类内声明 
                Student(T1 name,T2 num);
                
                void showstudent();
};

//构造函数 内外实现 
template<class T1,class T2>
Student<T1,T2>::Student(T1 name,T2 num)
{
        this->m_name = name;
        this->m_num = num;
}

//成员函数 类外实现 
template<class T1,class T2>
void Student<T1,T2>::showstudent()
{
        cout << "name : " << this->m_name << "  num : " << this->m_num << endl;
}

void test1()
{
        Student<string,int>p("回锅肉",50);
        p.showstudent();
}

int main()
{
        test1();
        
        return 0;
}
类模板分文件编写
1、直接包含.cpp源文件
2、将声明和实现写到同一个文件中,并更改后缀名为.hpp(hpp是约定的名称不是强制)

类模板和友元
全局函数类内实现——直接在类内声明友元
全局函数类外实现——需提前让编译器知道全局函数的存在
#include<iostream>
#include<string>

using namespace std;

//全局函数配合友元类外实现
//函数声明模板->函数模板定义->友元
 
//增加类模板声明 
template<class T1,class T2>
class Student;

//需要将实现体写在前面让编译器看到    也可以将实现体写到后面 

//实现体写在后面,先声明 
template<class T1,class T2>
void showstudent3(Student<T1,T2>&p);

//实现体写在前面 
template<class T1,class T2>
void showstudent2(Student<T1,T2>&p) 
{
        cout << "showstudent2!!!!!!!!!!!!!!!!!" << endl;
        cout << " name : " << p.m_name << "   num : " << p.m_num << endl;
}

template<class T1,class T2>
class Student
{
        //全局函数类内实现 
        friend void showstudent1(Student<T1,T2>&p)
                {
                        cout << "showstudent1!!!!!!!!!!!!" << endl;
                        cout << "name : " << p.m_name << "   num : " << p.m_num << endl;
                }
        //全局函数类外实现  类内声明
        //加空模板参数列表 
        friend void showstudent2<>(Student<T1,T2>&p);
        friend void showstudent3<>(Student<T1,T2>&p);
        
        public:
                T1 m_name;
                T2 m_num;
                
                Student(T1 name,T2 num)        
                {
                        this->m_name = name;
                        this->m_num = num;
                }
};

//实现体实现 
template<class T1,class T2>
void showstudent3(Student<T1,T2>&p)
{
        cout << "showstudent3!!!!!!!!!!!!!!!!!" << endl;
        cout << " name : " << p.m_name << "   num : " << p.m_num << endl;
}

void test1()
{
        Student<string,int>a("上上谦",99999);
        showstudent1(a);
        showstudent2(a);
        showstudent3(a);
}

int main()
{
        test1();
        
        return 0;
}
                                                      我又来喽

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 17:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表