在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() {
...
}
答案 0 :(得分:21)
实现文件中的一个独立函数改进了封装:它不需要在头文件中声明,因此当签名因任何原因发生更改时,不会重新编译客户端代码。对我来说,这是一个足够好的理由,只要可行,就更喜欢这个选项。 (确保将其放在匿名命名空间中以防止链接时发生标识符冲突。)
但是,private
方法可以通过this
指针访问类实例及其私有部分。如果它需要这样的访问权限,那么它必须是方法或friend
。在这两种情况下,它都会在类定义(头文件)中可见,并且方法比朋友更方便。
答案 1 :(得分:4)
如果你的辅助函数有意义成为对象的一个方法,我几乎总是喜欢使它成为一个成员函数,所以有一个隐式this
指针,而不是传递Foo *
到辅助功能。
如果辅助函数不需要是对象的方法(也就是说,它不需要访问数据成员或其他成员函数),那么将它作为独立函数(static
或在匿名命名空间中,最好是)。
答案 2 :(得分:2)
我认为这有点主观。
在我看来,这取决于它是否与班级成员有关和/或你是否希望朋友班使用它(或者在protected
访问的情况下派生类)。
如果该函数实际上没有对任何成员进行操作,并且没有其他人对它感兴趣,则应将其作为静态函数保存在实现文件中。此外,如果这是一项必须快速的操作,您可以借此机会将其inline
。
相反,如果函数在类上运行,或者在派生类或相关类中有额外用途,请将其作为成员。
答案 3 :(得分:1)
我的立场是标题包含尽可能少的广告,同时实现所需的设计和布局属性。如果有选项,它会进入源。但是,一些内部细节需要访问类的太多内部细节才能使其适用于实现。