C++模板类和模板函数放在多个文件中的实践

本文围绕C++类模板声明与实现展开实践。介绍了常规分成3个文件、类模板等放一个.h文件、模板函数及成员函数和main()在同一文件、main()文件引用cpp文件而非.h文件这几种方式。指出类模板声明与实现分开易出错,建议放在一个文件中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是对类模板声明与实现的实践。

一. 常规的写法分成3个文件

seqList.h.h文件:

//顺序表的类声明
#define defaultSize 100
template<class T>
class SeqList {
private:
    T* data;               //存放数组
    int maxSize;           //可容纳最大表项的项数
    int current;           //当前表项的最后位置(从0开始)
public:
    SeqList(int sz = defaultSize); //构造函数
    ~SeqList() { if (data != nullptr) delete[]data; }
    int getSize();                 //获取maxSize
};


seqList.h.cpp文件

#include"seqList.h"
#include<iostream>
using namespace std;
 
//定义构造函数
//通过指定参数sz定义数组长度
template<class T>
SeqList<T>::SeqList(int sz /*= defaultSize*/) {
    if (sz > 0) {
        maxSize = sz; current = -1;      //设置表的实际长度为空
        data = new T[maxSize];        //创建顺序表存储数组
        if (data == nullptr) {        //动态分配内存失败
            cerr << "内存分配失败!" << endl;
            exit(1);
        }           
    }
}

template<class T>
int SeqList<T>::getSize() {
     return maxSize;
}

main.cpp文件

#include"seqList.h"
#include<iostream>
using namespace std;
 
int main() {
    SeqList< int >testList(5);
    cout << testList.getSize() << endl;
    return 0;
}


结果显示:

都是一些莫名奇妙的错误啊,开始我按照错误提示去问度娘,却一点收获都没有,不过最后还是解决了,大家请看!!:

二. 类模板和模板函数以及成员函数放在一个.h文件中

seqList.h文件:

#pragma once
#include<iostream>
using namespace std;
 
//顺序表的类声明
#define defaultSize 100
template<class T>
class SeqList {
private:
    T* data;               //存放数组
    int maxSize;           //可容纳最大表项的项数
    int current;           //当前表项的最后位置(从0开始)
public:
    SeqList(int sz = defaultSize); //构造函数
    ~SeqList() { if (data != nullptr) delete[]data; }
    int getSize();                 //获取maxSize
};
 
//定义构造函数
//通过指定参数sz定义数组长度
template<class T>
SeqList<T>::SeqList(int sz /*= defaultSize*/) {
    if (sz > 0) {
        maxSize = sz; current = -1;      //设置表的实际长度为空
        data = new T[maxSize];        //创建顺序表存储数组
        if (data == nullptr) {        //动态分配内存失败
            cerr << "内存分配失败!" << endl;
            exit(1);
        }
    }
}
//获取maxSize
template<class T>
int SeqList<T>::getSize() {
    return maxSize;
}


main.cpp文件:

#include"seqList.h"
 
int main() {
    SeqList< int >testList(5);
    cout << testList.getSize() << endl;
    return 0;
}


结果显示:

代码一点没有变。仅仅是调换了位置。。。。。。。。。就可以了,所以:一般情况下我们编写C++代码的时候都会习惯性的将声明性的代码放在.h文件中,然后将实现文件放在.cpp文件中,只需加载相关的.h文件即可。但是在类模板中这个是行不通的,如果遇到这种情况,只需要将类模板的实现在其对应的声明文件中就可以解决问题。

实际上,类模板和函数实现也不是不能分开到多个文件中,比如把函数实现和main()放到一个文家中,也是可以工作的。

三. 模板函数及成员函数和main()在同一个文件中

a.h文件

#include <iostream>  
using namespace std ;
  
template <class T>  
class Base  
{  
public :      
    T a ;  
    Base(T b)  
    {  
        a = b ;      
    }     
    T getA(){ return a ;} //类内定义   
    void setA(T c);  
};  
  

a.cpp

#include <iostream>  
#include "a.h"
using namespace std ;  

template <class T>   //模板在类外的定义   
void  Base<T>::setA(T c)  
{  
    a = c ;  
}  
  

int main(void)  
{  
    Base <int>b(4);  
    cout<<b.getA()<<endl;   
  
    Base <double> bc(4);  
    bc.setA(4.3);  
    cout<<bc.getA()<<endl;   
    system("pause");   
    return 0 ;      
}  

四. main()文件引用cpp文件而不是.h文件

通过第3种方式,我们可以猜测,是不是引用cpp文件就可以了呢?

a.h文件

#include <iostream>  
using namespace std ;
  
template <class T>  
class Base  
{  
public :      
    T a ;  
    Base(T b)  
    {  
        a = b ;      
    }     
    T getA(){ return a ;} //类内定义   
    void setA(T c);  
};  
  

a.cpp文件

#include <iostream>  
#include "a.h"
using namespace std ;  

template <class T>   //模板在类外的定义   
void  Base<T>::setA(T c)  
{  
    a = c ;  
}  
  

main.cpp文件

#include "a.cpp"//注意,这里引用的cpp文件。
using namespace std;

int main(void)  
{  
    Base <int>b(4);  
    cout<<b.getA()<<endl;   
  
    Base <double> bc(4);  
    bc.setA(4.3);  
    cout<<bc.getA()<<endl;   
    system("pause");   
    return 0 ;      
}  

可以正常运行。这说明,对于类模板的声明与实现放在不同文件中的情况,在main()函数使用时,需要引用类模板的实现所在的文件,而不是声明所在的文件。但这种方式明显不太好,所以还是建议把类模板的声明与实现放在一个文件中。


参考链接:https://blog.youkuaiyun.com/qq_37623612/article/details/79473627

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值