我一直认为头文件是一种描述类的“公共接口”,在这种情况下,最好将私有字段和函数保留在 .cpp 文件中。
我知道私有字段需要位于标头中,以便其他类可以知道类的实例将消耗多少内存,但当我即将编写一个私有辅助函数时,我想到可以使该函数成为static,在这种情况下,它根本不需要成为“类的一部分”,它可以很容易地成为类定义的 .cpp 文件中的常规函数。
然后我想到all通过接受类字段的指针/引用而不是期望在类中定义,私有函数可能会被重写为静态函数。
这将消除在头文件中声明任何私有函数的需要。
我确实喜欢遵循约定,所以它被认为是 C++ 中的既定约定,即非静态私有函数should是在头文件中吗?静态函数或静态常量怎么样?
我将输入一些代码来解释我的意思:
.h file:
#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;
}
注意someHelper(int* x)
.cpp 文件中引用了 Spirit 中的私有成员 x,但不是直接引用,因此不需要出现在标头中。我想知道这种事情是否被认为是“糟糕的风格”。
通过将私有辅助函数移至内部类,可以将其从公共头文件中隐藏。这是有效的,因为内部类被视为类的一部分,并且可以访问周围类的私有成员。
不像PIMPL https://cpppatterns.com/patterns/pimpl.html习语,这没有任何动态分配或间接惩罚。编辑/重构私有函数时,编译时间应该更快,因为不需要重新编译所有文件,包括公共标头。
Example:
公共 .h 文件
#ifndef SOME_CLASS_H
#define SOME_CLASS_H
class SomeClass
{
private:
// Just forward declaring in public header.
struct Private;
int x;
public:
void combineWithX(int y);
};
#endif
在 .cpp 文件中
#include "SomeClass.h"
// Declare all private member functions of SomeClass here
struct SomeClass::Private
{
static void someHelper(SomeClass& self)
{
self.x = self.x + 1;
}
};
void SomeClass::combineWithX(int y)
{
Private::someHelper(*this);
x += y;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)