有人在这里问了一个与我类似的问题: Function declaration inside or outside the class?
为什么只在.h
文件中声明一个函数而不是定义,然后在.cpp
文件中写出整个定义?重点是什么?为什么不把整个函数放在头文件中的一个类中,而不仅仅是声明它?它似乎具有重复性和无意义。
如何构建程序以使用头文件和其他.cpp
文件而不将函数,类和变量堆积到主文件中?我可以使用.h
文件和一些.cpp
文件获得一个简单程序的示例吗?
答案 0 :(得分:2)
为什么只在
.h
文件中声明一个函数而不是定义,然后在.cpp
文件中写出整个定义?重点是什么?你为什么不把整个函数放在头文件中的一个类中,而不仅仅是声明它?它似乎具有重复性和无意义。
修改标题时,必须重新编译通过#include
引用该标题内容的所有代码。
如果您有许多其他文件包含的标头,那么对该标头内容的单个更改可能需要对整个项目进行相当长时间的重建。如果您只处理小型项目,但想象有数千个类的生产应用程序,这似乎并不重要。
另一个好处是编写库时。当您提供库二进制文件以供其他人使用时,您只需提供标题。通过这种方式,您可以在源文件本身中拥有用户无权访问的专有源代码。
最后,通过将内容分成单独的头文件和源文件,可以更轻松地学习库。很多时候,当我使用新的API时,我只想浏览标题以获得类及其功能的要点。我不需要查看或想要解析实现。
这并不是说你拥有来拥有单独的头文件和源文件。有很多标题库(例如GLM)可以为广大受众提供服务。当然,这些通常仅作为标题分发,因此不需要二进制(静态或动态)。
当然,如果您要创建模板类,请执行generally goes within the header。
如何构建程序以使用头文件和其他
.cpp
文件而不将函数,类和变量堆积到主文件中?我可以使用.h
和几个.cpp
文件获取一个简单程序的示例。
这可能超出了本网站的范围,但这是一个简单的例子。
<强> Rectangle.hpp 强>
#ifndef H__RECTANGLE__H
#define H__RECTANGLE__H
class Rectangle
{
public:
Rectangle(float width = 0.0f, float height = 0.0f);
~Rectangle();
void setWidth(float width) noexcept;
void setHeight(float height) noexcept;
float getArea() const noexcept;
protected:
private:
float m_fWidth;
float m_fHeight;
};
#endif
<强> Rectangle.cpp 强>
#include "Rectangle.hpp"
Rectangle::Rectangle(float const width, float const height)
: m_fWidth{ width },
m_fHeight{ height }
{
}
Rectangle::~Rectangle()
{
}
float Rectangle::getArea() const noexcept
{
return m_fWidth * m_fHeight;
}
void Rectangle::setWidth(float const width) noexcept
{
m_fWidth = width;
}
void Rectangle::setHeight(float const height) noexcept
{
m_fHeight = height;
}
<强>的main.cpp 强>
#include "Rectangle.hpp"
#include <iostream>
int main()
{
Rectangle rectA{ 5, 5 };
Rectangle rectB{ 3, 2 };
std::cout << "Area of Rectangle A is: " << rectA.getArea() << std::endl;
std::cout << "Area of Rectangle B is: " << rectB.getArea() << std::endl;
return 0;
}
现在如何编译和链接这些文件取决于您使用的IDE。