C++学习Day08之类模板中的成员函数分文件编写问题及解决


一、程序及输出

1.1 .h文件+cpp

person.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;


template<class T1, class T2>
class Person
{
public:
	Person(T1 name, T2 age);

	void showPerson();
	
	T1 m_Name;
	T2 m_Age;
};

person.cpp

#include "person.h"

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

template<class T1, class T2>
void Person<T1, T2>::showPerson()
{
	cout << "姓名: " << this->m_Name << " 年龄:" << this->m_Age << endl;
}

main.cpp

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

void test01()
{
	Person<string, int> P("Jerry", 20);
	P.showPerson();
}


int main(){
	test01();
	system("pause");
	return EXIT_SUCCESS;
}

报错:
在这里插入图片描述
之前文章说过:类模板中的成员函数 并不是一开始创建的,而是在运行阶段确定出T的数据类型才去创建
所以会链接不到

main.cpp内容修改:
#include “person.h”—>#include “person.cpp”
运行正常,但是包含文件格式略显不规范
在这里插入图片描述

1.2 包含hpp

类模板的声明和定义要写在一个.hpp文件中,声明和定义不可以分开,因为分文件的话,main.cpp中只引入.h,在类模板进行二次编译的时候,无法找到类的定义,会出错。所以要将其声明和定义放到一个头文件中。类模板必须要写在.hpp文件中。

将h文件和cpp文件综合到一个person.hpp文件

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

template<class T1, class T2>
class Person
{
public:
	Person(T1 name, T2 age);

	void showPerson();
	
	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;
}

template<class T1, class T2>
void Person<T1, T2>::showPerson()
{
	cout << "姓名: " << this->m_Name << " 年龄:" << this->m_Age << endl;
}

main.cpp

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

void test01()
{
	Person<string, int> P("Jerry", 20);
	P.showPerson();
}


int main(){
	test01();
	system("pause");
	return EXIT_SUCCESS;
}

输出:
在这里插入图片描述


二、分析与总结

类模板中的成员函数,不会一开始创建,因此导致分文件编写时连接不到函数的实现,出现无法解析的外部命令错误
解决方式1:
直接包含.cpp文件 (不推荐)
解决方式2:
将类声明和实现写到同一个文件中,将文件的后缀名改为 .hpp 即可

参考链接:
c++中.hpp文件的使用

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在VSCode进行C++文件编译时,如果你的项目包含了类,并且类有静态成员函数,你需要按照以下步骤进行操作: 1. 创建头文件和源文件:对于每个类,创建一个头文件(`.h`或`.hpp`扩展名)和一个源文件(`.cpp`扩展名)。头文件将包含类的声明,而源文件将包含类的定义和实现。 2. 在头文件声明类:在头文件使用类声明语法来定义你的类。例如,可以使用`class`关键字来声明一个类,并在类内部定义静态成员函数。 3. 在源文件实现类的静态成员函数:在源文件实现类的静态成员函数。确保你的实现与头文件的声明一致。 4. 在需要使用类的源文件包含头文件:在需要使用类的源文件使用`#include`指令来包含类的头文件。这样可以让编译器知道类的定义和声明。 5. 编写其他源代码:编写其他源文件的代码,并确保你的代码使用了正确的类和静态成员函数。 6. 配置编译任务:在VSCode,使用快捷键`Ctrl + Shift + B`(Windows/Linux)或者`Cmd + Shift + B`(Mac)来打开构建任务菜单。选择"C/C++: g++ build active file"来生成一个默认的构建任务。 7. 运行构建任务:在VSCode,使用快捷键`Ctrl + Shift + B`(Windows/Linux)或者`Cmd + Shift + B`(Mac)选择您要运行的构建任务。 8. 查看输出信息:构建任务成功运行后,将在VSCode的终端显示构建输出的信息。您可以查看编译错误、警告或生成的可执行文件等信息。 请注意,具体的步骤和配置可能因您的项目和开发环境而有所不同。您可能需要根据实际情况自定义构建任务和编译选项。 希望这些步骤能帮助您在VSCode成功进行C++文件编译,并包含了类和静态成员函数。如有任何问题,请随时向我提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值