C 私有函数真的需要在头文件中吗?

新手上路,请多包涵

我一直认为头文件是一种描述类的“公共接口”,在这种情况下,最好将私有字段和函数保留在 .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 许可协议

阅读 2.3k
2 个回答

我同意需要在头文件中公开实现细节是一个问题;它干扰了接口和实现的分离。

如果这些函数需要访问私有成员变量,则将私有帮助函数移动为 .cpp 文件中的自由函数(我认为这就是您所说的“静态”)将不起作用。

您可能有兴趣查看 pImpl 成语 (更多)

原文由 M.M 发布,翻译遵循 CC BY-SA 3.0 许可协议

通过将私有帮助函数移动到内部类,可以从公共头文件中隐藏它们。这是因为内部类被认为是类的一部分并且可以访问周围类的私有成员。

PIMPL 习语不同,这没有任何动态分配或间接惩罚。编辑/重构私有函数时编译时间应该更快,因为不需要重新编译所有文件,包括公共头文件。

例子:

公共 .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;
}

原文由 balki 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题