帮助程序函数应该放在标头中还是在实现文件中
Should a helper function go in the header or in the implementation file?
在C++中为类编写帮助程序方法时,是否应该在头 (.h) 文件的类定义中将其声明为私有方法?例如:
/*Foo.h*/
class Foo {
public:
int bar();
private:
int helper();
};
...
/*Foo.cpp*/
...
int foo::bar() {
int something = this->helper();
}
int foo::helper() {
...
}
或者,是否最好不要将其声明为类的私有成员,而只是在实现中使其成为独立的函数?
/*Foo.h*/
class Foo {
public:
int bar();
};
...
/*Foo.cpp*/
...
int Foo::bar() {
int something = helper();
...
}
int helper() {
...
}
实现文件中的独立函数改进了封装:它不需要在标头中声明,因此当其签名因任何原因更改时,无需重新编译客户端代码。对我来说,这是一个很好的理由,只要可行,就更喜欢这个选项。(请务必将其放在匿名命名空间中,以防止在链接时发生标识符冲突。
但是,private
方法可以通过this
指针访问类实例及其私有部分。如果它需要这样的访问,那么它必须是一个方法或一个friend
。在这两种情况下,它都将在类定义(头文件)中可见,并且方法比朋友更方便。
如果您的帮助程序函数有意义的对象方法,我几乎总是希望将其设置为成员函数,以便有一个隐式this
指针,而不是将Foo *
传递给帮助程序函数。
如果帮助程序函数不需要是对象的方法(即,它不需要访问数据成员或其他成员函数),则使其成为独立函数(最好是static
或匿名命名空间)。
这有点主观。
在我看来,这取决于它是否与类的成员有任何关系和/或您是否希望友元类使用它(或在protected
访问的情况下使用派生类)。
如果该函数实际上并未在任何成员上运行,并且没有其他人对它感兴趣,则应将其作为静态函数保留在实现文件中。 此外,如果这是一个必须快速的操作,您可以借此机会使其inline
。
相反,如果函数对类进行操作,或者在派生类或相关类中可能有额外的用途,则使其成为成员。
我的立场是,标题包含尽可能少的广告,同时实现所需的设计和布局属性。如果有选项,它会进入源。但是,某些内部细节需要访问类的太多内部细节,以便将其放入实现中。
- 在实现文件中使用头文件的通用 lambda
- 在文件上实现迭代器
- C++头文件和类实现出现问题
- 在文件夹迭代上实现 RAII
- 如何使用命令提示符、记事本和 MinGW 使用主文件、头文件和实现文件编译C++程序?
- 用于 Windows 写入临时文件的 mkstemp() 实现
- 类中的数组变量C++导致"was not declared in this scope"实现文件的一个函数中错误,但在构造函数中不会导致错误
- Linux 源代码中普通磁盘文件的"轮询"功能在哪里实现?
- 在 *.cpp 文件中实现的 c++ 函数/方法永远不会内联扩展吗?
- 在实现文件中使用模板参数声明方法
- 在头文件中使用opencv类型来实现未定义的标识符
- 模板实现文件中的匿名命名空间
- 创建单独的实现文件和头文件
- 多文件类实现Cpp
- Reader类实现中的文件读取错误
- MEX文件实现特征库伪内函数崩溃
- openssl rc4 命令行加密和 cpp 文件实现 rc4 之间的区别
- 从其他头文件实现结构
- c++头文件-实现-头文件-实现依赖链
- 内存映射文件实现