在这种情况下,我应该使用头文件吗?
Should I use header files in this specific situation?
我的应用程序由几个继承了抽象基类的组件组成。除了每个组件覆盖的这两个成员函数之外,没有组件有任何公共声明。
class Component()
{
public:
virtual void Init() = 0;
virtual void Update() = 0;
};
既然没有其他公共方法或成员,创建头文件有意义吗?这样可以节省编译时间吗?还是有其他方法?
如果不在单个CPP文件之外使用该类,则不需要头文件。否则,您可以在自己承担风险的情况下避免编写头文件:潜在的损失(基类不一致的重新声明)远远超过潜在的收益(加快编译时间)。整个项目的可读性也会受到影响——项目的其他读者会期望在那里看到一个头文件,并且会惊讶地看到不同文件中的多个副本。
如果您有许多从Component
派生的派生类,您可以将其放在单独的头文件:IComponent.h
中。I
表示接口,是c++中的抽象类。这使得代码结构非常清晰。
你的代码有UB,因为你没有为抽象类定义virtual destructor
:
class Component()
{
public:
virtual ~Component();
virtual void Update() = 0;
};
如果通过指向基类的指针删除派生类型的对象,将得到未定义的行为。
也正如@Griwes指出的,只需使用构造函数初始化成员,不需要有多余的virtual Init
函数
不需要写头文件
这完全取决于你如何使用这个类。如果您只在一个源文件中使用派生类,则没有特别的理由使用头文件。
我不会担心编译时间,除非你运行的机器已经超过10年了。现代机器的缓存磁盘读起来非常好,你很可能会包含几个兆字节的其他头文件。
但是,如果您想在其他项目中"重用"您的类,那么现在就很难做到了。
创建头文件通常是一个好主意,即使对于性能提升并不显著的小程序也是如此。这是一个很好的编码习惯,你应该养成!:)
http://www.cplusplus.com/forum/articles/10627/相关文章:
- 我是c ++的新手,你能解释一下在这种情况下的指针吗
- 在这种情况下,java对象是否可以调用本机函数
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 在这种情况下,我真的复制了字节还是复制了字符?
- 为什么在这种情况下,bool 类型的输出等于 0?
- 是否可以在没有真实文件的情况下创建 ifstream
- 在这种情况下,如何传递成员函数而不是函数?
- 为什么在这种情况下递增阵列名称有效?
- 如何在添加文件的情况下在VSCode中调试C++程序
- 在这种情况下我应该使用哪种设计模式
- 为什么在这种情况下我需要 .template
- 在这种情况下,使用 string_view 是否会导致不必要的字符串复制?
- 我是否访问了已释放的内存,或者在这种情况下DrMemory报告不正确?
- 在这种情况下,"typename..."意味着什么?
- 为什么在这种情况下 x = 44?
- 在这种情况下,我如何包括所有.CPP和标头文件
- 在这种情况下,将数据存储在诸如SQLite之类的数据库中,还是存储在平面文本文件中更好
- 更好地理解makefile——在这种情况下如何生成.o文件
- 在这种情况下,是否可以在cpp文件中编写模板专门化?
- 在这种情况下,我应该使用头文件吗?