如何使用自己写的头文件?c++ 类

时间:2021-10-10 17:40:30
我写了一个顺序栈的类,又写了一个表达式括号匹配的函数,函数用顺序栈这种数据结构存储左括号以达到括号匹配的目的。
但是我不想把类和函数放在一个文件里,显得比较乱,于是我把类放进头文件,把函数放进源文件里,如下图:
如何使用自己写的头文件?c++ 类
如何使用自己写的头文件?c++ 类
如何使用自己写的头文件?c++ 类
如何使用自己写的头文件?c++ 类
然后在函数的cpp文件里用了# include"SeqStack",但是程序提醒我无法打开文件SeqStack,是哪里出了问题?
正确方法是什么呢?

9 个解决方案

#1


.h                -> head
.cpp

#2


头文件的话只要把.cpp改成.h就行了啊,如果检测不到你可以添加绝对路径啊,比如#iinclude "C:\Program Files (x86)\NVIDIA Corporation\NVIDIA GeForce Experience.h"。

#3


引用 2 楼 litchgu 的回复:
头文件的话只要把.cpp改成.h就行了啊,如果检测不到你可以添加绝对路径啊,比如#iinclude "C:\Program Files (x86)\NVIDIA Corporation\NVIDIA GeForce Experience.h"。


可以在哪里设置相对路径吗?绝对路径有失美观啊

#4


类模板不支持分离编译,你需要放到一个文件里

#6


引用 3楼火上木 的回复:
Quote: 引用 2 楼 litchgu 的回复:

头文件的话只要把.cpp改成.h就行了啊,如果检测不到你可以添加绝对路径啊,比如#iinclude "C:\Program Files (x86)\NVIDIA Corporation\NVIDIA GeForce Experience.h"。


可以在哪里设置相对路径吗?绝对路径有失美观啊
这个要看你编译器了啊

#7


模板函数的定义和声明须在同一文件内
按照C++中代码的惯例,类声明在h文件中,类定义在cpp文件中,相应的成员函数声明也在h文件中,定义在cpp文件中。但是如果这样的架构用在模板函数中,在调用模板函数的地方链接器便会报错,error LNK2001: unresolved external symbol。将定义写在与声明相同的文件中问题解决,解释如下:

“大部分编译器在编译模板时都使用包含模式。也就是一般使用的把模板放到头文件中再包含。
当你不使用这个模版函数或模版类,编译器并不实例化它。当你使用时,编译器需要实例化它。因为编译器是一次只能处理一个编译单元,也就是一次处理一个cpp文件,所以实例化时需要看到该模板的完整定义,所以都放在头文件中。
这不同于普通的函数,在使用普通的函数时,编译时只需看到该函数的声明即可编译,而在链接时由链接器来确定该函数的实体。”

#8


个人感觉模板特别,还是为了编译快吧,只看到定义,调用文件一样可以进行编译,但是轮到模板实现开始编译,就有问题了,无法确定需要多少T的版本,所以干脆让调问文件,就地生成一份确定T的代码,

#9


模板是语法糖。
语法糖越甜,编译调试查错越苦!
把有限的生命浪费在品尝/品鉴无穷多种的语法糖中,我认为不值当。

#1


.h                -> head
.cpp

#2


头文件的话只要把.cpp改成.h就行了啊,如果检测不到你可以添加绝对路径啊,比如#iinclude "C:\Program Files (x86)\NVIDIA Corporation\NVIDIA GeForce Experience.h"。

#3


引用 2 楼 litchgu 的回复:
头文件的话只要把.cpp改成.h就行了啊,如果检测不到你可以添加绝对路径啊,比如#iinclude "C:\Program Files (x86)\NVIDIA Corporation\NVIDIA GeForce Experience.h"。


可以在哪里设置相对路径吗?绝对路径有失美观啊

#4


类模板不支持分离编译,你需要放到一个文件里

#5


#6


引用 3楼火上木 的回复:
Quote: 引用 2 楼 litchgu 的回复:

头文件的话只要把.cpp改成.h就行了啊,如果检测不到你可以添加绝对路径啊,比如#iinclude "C:\Program Files (x86)\NVIDIA Corporation\NVIDIA GeForce Experience.h"。


可以在哪里设置相对路径吗?绝对路径有失美观啊
这个要看你编译器了啊

#7


模板函数的定义和声明须在同一文件内
按照C++中代码的惯例,类声明在h文件中,类定义在cpp文件中,相应的成员函数声明也在h文件中,定义在cpp文件中。但是如果这样的架构用在模板函数中,在调用模板函数的地方链接器便会报错,error LNK2001: unresolved external symbol。将定义写在与声明相同的文件中问题解决,解释如下:

“大部分编译器在编译模板时都使用包含模式。也就是一般使用的把模板放到头文件中再包含。
当你不使用这个模版函数或模版类,编译器并不实例化它。当你使用时,编译器需要实例化它。因为编译器是一次只能处理一个编译单元,也就是一次处理一个cpp文件,所以实例化时需要看到该模板的完整定义,所以都放在头文件中。
这不同于普通的函数,在使用普通的函数时,编译时只需看到该函数的声明即可编译,而在链接时由链接器来确定该函数的实体。”

#8


个人感觉模板特别,还是为了编译快吧,只看到定义,调用文件一样可以进行编译,但是轮到模板实现开始编译,就有问题了,无法确定需要多少T的版本,所以干脆让调问文件,就地生成一份确定T的代码,

#9


模板是语法糖。
语法糖越甜,编译调试查错越苦!
把有限的生命浪费在品尝/品鉴无穷多种的语法糖中,我认为不值当。