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

2024-02-05

我一直认为头文件是一种描述类的“公共接口”,在这种情况下,最好将私有字段和函数保留在 .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(使用前将#替换为@)

C++ 私有函数真的需要放在头文件中吗? 的相关文章

随机推荐

  • Jboss AS7 - 如何为外部库创建 module.xml?

    我有多个使用多个库的 ear 项目 所以我需要使它们变得通用并将它们添加到模块中 那么 当我需要为每个库创建 module xml 时 是否有任何简单的方法来创建 module xml 我还需要在 module xml 中定义每个库的依赖关
  • 如何在 Rabbit.js 上创建 REP/REQ

    我已经在 Net 上使用 RabbitMQ 一段时间了 并且没有遇到太大的问题 现在我正在使用 node js 迁移到rabbit js 但我对它不太熟悉 rabbit js 的文档有限 我只知道基本的 PUSH PULL 或 PUB SU
  • 如何在C#中使组合框在鼠标悬停时自动展开并在鼠标离开组合框时关闭? [复制]

    这个问题在这里已经有答案了 我有一个窗口窗体 在该窗口窗体中我有一个组合框 我在组合框中预定义了项目添加 删除和删除 我想让组合框在鼠标悬停时自动展开 我怎样才能做到这一点 我注意到自动展开代码应该在组合框的鼠标悬停事件中给出 像这样 pr
  • 为什么我的平方函数不运行?

    我决定编写一个程序来计算数字的平方只是为了好玩 使用在线编译器 我输入了代码 据我所知 没有错误 它不会运行它只会有一个空白的控制台条目 我的代码 import math def square number raw input Please
  • php:自动缩进整个代码?

    是否有任何 netbeans eclipse 的软件 插件可以在插入后自动缩进整个代码 当我按下 ENTER 以获得新功能时 不仅仅是缩进 我想粘贴一个没有缩进的代码 它会自动缩进所有内容 因为它可以识别使用的语言 应该可以节省很多时间 在
  • 如何在 Google 电子表格中减去两组值?

    我有两组值A A and B B 如何在它们之间进行设置差异 最好使用公式 即从A A不存在于B B 这样的公式可以做到这一点 并且速度相当快 filter A A countif B B A A 0
  • 在 View(CakePHP) 中,获取当前控制器的正确方法?

    在视图中 我可以通过使用来采取行动 this gt action 但是 我无法通过以下方式获取控制器名称 this gt controller 在视图中获取当前控制器的正确方法是什么 Use this gt params controlle
  • 共享内存编程中的 shm_open 和 ftruncate()

    我想创建一个共享内存对象并将其截断为特定大小 SHMSIZE 定义为 512 MODE 设置为 S IRUSR S IWUSR S IWGRP S IRGRP S IWOTH S IROTH 这是我的代码 char shm name Sha
  • SQL Server 中的合并和合并联接相同吗?

    SQL Server 中的合并和合并联接有什么区别 MERGE是一种DML语句 数据操作语言 也称为 UPSERT 更新 插入 它尝试根据您定义的条件将源 表 视图 查询 与目标 表 可更新视图 匹配 然后根据匹配结果向目标表中插入 更新
  • 找不到模块node_modules\@ionic\app-scripts IONIC 3

    我已经安装了npm 3 10 10那么我有installed ionic 3 9 2 and cordova 7 0 1 我尝试了以下步骤 ionic start newProject 选择一个选项卡项目 ionic serve 该命令将t
  • Objective-C 编程中单键保存多个值的 NSMutableDictionary

    请告诉我如何在 NSMutableDictionary 中为同一个键拥有多个值 当我使用以下方法时 这些值将被替换为最近的值 就我而言 dictionary setObject forename forKey NSNumber number
  • 数据标准化和编写查询

    我是jr开发人员 工作 5 个月 我有一个关于数据标准化的问题 现在 据我了解 数据规范化背后的一般原则是创建一个将数据冗余保持在最低限度的 RDBMS 在我的项目中 一位数据库人员创建了一个数据库 我们有 50 多个表 数据库中的表通常非
  • 无法找到工件 jackson-modules-java8 jar

    我正在使用 pom xml 像
  • 如何在 gradle 项目中使用 eclim

    我的 eclim 设置与 eclipse 项目完美配合 但我想使用 gradle 构建系统 我正在使用 Libgdx 框架 它提供 gradle templatete 项目 那么有没有办法使用eclime eclipse gradle 你最
  • 如何在 ASP.NET Identity 1.1 nightly build 中实现 TokenProvider?

    我正在尝试使用 ASP NET Identity 1 1 的夜间构建来实现密码重置功能 有一个 UserManager GetPasswordResetToken 方法 但它抛出异常 没有注册 ITokenProvider ASP NET
  • matplotlib afm 导入速度极慢

    导入时间长得令人无法接受 from matplotlib import pylab as plt gt 3 0124739 secs 这是 cProfile 的输出 它清楚地显示了 afm py 的问题 这是 afm py 的一些接口Ado
  • 如何在 Typesafe Config 中获取解开的密钥?

    测试用例 import org specs2 mutable class HelloWorldSpec extends Specification Typesafe Config should allow me to see my esca
  • 用Python实现的好的双向加密库是什么?

    我们现在使用的应用程序的身份验证系统使用双向哈希 基本上只不过是美化的凯撒密码 在不详细了解它的情况的情况下 我想用更安全的加密算法替换它 并且需要在服务器端完成 不幸的是 它需要是双向的 而 hashlib 中的算法都是单向的 有哪些好的
  • 未实现委托方法导致崩溃

    我创建了一个协议并将其分配给委托对象 protocol AppBrainDelegate
  • C++ 私有函数真的需要放在头文件中吗?

    我一直认为头文件是一种描述类的 公共接口 在这种情况下 最好将私有字段和函数保留在 cpp 文件中 我知道私有字段需要位于标头中 以便其他类可以知道类的实例将消耗多少内存 但当我即将编写一个私有辅助函数时 我想到可以使该函数成为static