我一直认为头文件是一种描述类的“公共接口”,在这种情况下,最好将私有字段和函数保留在 .cpp 文件中。
我知道私有字段需要在标头中,以便其他类可以知道一个类的实例将消耗多少内存,但是当我要编写一个私有帮助函数时,我突然想到,可以制作这个函数static,在这种情况下,它根本不需要成为“类的一部分”,它可以很容易地成为类定义的 .cpp 文件中的常规函数。
然后我想到,通过接受对类字段的指针/引用而不是期望在类中定义, 所有 私有函数都可能被重写为静态的。
这将消除在头文件中声明任何私有函数的需要。
我确实喜欢遵循约定,所以它是否被认为是 C++ 中的既定约定,非静态私有函数 应该 在头文件中?静态函数或静态常量呢?
我将输入一些代码来解释我的意思:
.h 文件:
#ifndef SOME_CLASS_H
#define SOME_CLASS_H
class SomeClass
{
private:
int x;
public:
void combineWithX(int y);
};
#endif
.cpp 文件
#include "SomeClass.h"
void someHelper(int* x)
{
*x = (*x) + 1;
}
void SomeClass::combineWithX(int y)
{
someHelper(&x);
x += y;
}
请注意,.cpp 文件中的 someHelper(int* x)
引用了私有成员 x,但不是直接引用,因此不需要出现在标题中。我想知道这种事情是否被认为是“坏风格”。
原文由 Ghost314 发布,翻译遵循 CC BY-SA 4.0 许可协议
我同意需要在头文件中公开实现细节是一个问题;它干扰了接口和实现的分离。
如果这些函数需要访问私有成员变量,则将私有帮助函数移动为
.cpp
文件中的自由函数(我认为这就是您所说的“静态”)将不起作用。您可能有兴趣查看 pImpl 成语 (更多)