辅助函数应该在标题中还是在实现文件中?

时间:2012-10-04 22:56:16

标签: c++ oop coding-style

在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() {
    ...   
}

4 个答案:

答案 0 :(得分:21)

实现文件中的一个独立函数改进了封装:它不需要在头文件中声明,因此当签名因任何原因发生更改时,不会重新编译客户端代码。对我来说,这是一个足够好的理由,只要可行,就更喜欢这个选项。 (确保将其放在匿名命名空间中以防止链接时发生标识符冲突。)

但是,private方法可以通过this指针访问类实例及其私有部分。如果它需要这样的访问权限,那么它必须是方法或friend。在这两种情况下,它都会在类定义(头文件)中可见,并且方法比朋友更方便。

答案 1 :(得分:4)

如果你的辅助函数有意义成为对象的一个​​方法,我几乎总是喜欢使它成为一个成员函数,所以有一个隐式this指针,而不是传递Foo *到辅助功能。

如果辅助函数不需要是对象的方法(也就是说,它不需要访问数据成员或其他成员函数),那么将它作为独立函数(static或在匿名命名空间中,最好是)。

答案 2 :(得分:2)

我认为这有点主观。

在我看来,这取决于它是否与班级成员有关和/或你是否希望朋友班使用它(或者在protected访问的情况下派生类)。

如果该函数实际上没有对任何成员进行操作,并且没有其他人对它感兴趣,则应将其作为静态函数保存在实现文件中。此外,如果这是一项必须快速的操作,您可以借此机会将其inline

相反,如果函数在类上运行,或者在派生类或相关类中有额外用途,请将其作为成员。

答案 3 :(得分:1)

我的立场是标题包含尽可能少的广告,同时实现所需的设计和布局属性。如果有选项,它会进入源。但是,一些内部细节需要访问类的太多内部细节才能使其适用于实现。