我应该在哪里实现这个"私人"帮助函数?

NoS*_*tAl 11 c++

我的类定义分布在头文件和源文件中:

// T.hpp

class T {
   public:
      void foo();
};

// T.cpp

void T::foo() {

}
Run Code Online (Sandbox Code Playgroud)

如果T::foo需要使用一些T需要可见的辅助函数,以下哪种解决方案最好?

1.私人会员

// T.hpp

class T {
   public:
      void foo();
   private:
      void helper();
};

// T.cpp

void T::foo() {
    helper();
}

void T::helper() {
}
Run Code Online (Sandbox Code Playgroud)

2.仅在类定义的TU中可访问的自由函数

// T.hpp

class T {
   public:
      void foo();
};

// T.cpp

namespace {
    void helper() {}
}

void T::foo() {
    helper();
}
Run Code Online (Sandbox Code Playgroud)

有没有区别,除了前者我会在头文件中有更多的功能?

wil*_*ell 9

首选免费的非友元函数而不是成员函数,因为它们对类成员的访问权限少于成员函数,因此很少有机会引入错误.

如果函数完全在接口范围之外,那么还将它放在实现文件中的未命名命名空间中.这将进一步减少错误的可能性,因为其他翻译单元将无法调用该功能.

您在未命名的命名空间中与非朋友一起获得的另一个优点是您更改标题的可能性较小(因为那里的实体少了一个).由于编译时依赖性,更改头文件通常会大大减慢构建时间.私有与否,你可能会有很多翻译单元,这取决于标题中所有内容的编译.


bam*_*s53 6

需要访问私有成员的自由函数无论如何都需要在标题中使用友元声明,因此它们可能并不比私有成员函数更好.

不需要私有访问的函数应该是自由函数,无论它们是否在标题中声明.

因此,如果他们需要访问私人会员,那么让他们成为会员.否则使它们成为自由函数.

Scott Meyers有这个算法用于判断与C类相关的函数f是否应该是成员,朋友非成员或非成员非朋友:

http://drdobbs.com/184401197

if (f needs to be virtual)
   make f a member function of C;
else if (f is operator>> or
         operator<<)
   {
   make f a non-member function;
   if (f needs access to non-public
       members of C)
      make f a friend of C;
   }
else if (f needs type conversions
         on its left-most argument)
   {
   make f a non-member function;
   if (f needs access to non-public
       members of C)
      make f a friend of C;
   }
else if (f can be implemented via C's
         public interface)
   make f a non-member function;
else
   make f a member function of C;
Run Code Online (Sandbox Code Playgroud)