在C ++中将与类方法有关的帮助器函数放在何处

时间:2019-12-13 08:41:09

标签: c++ function namespaces class-design linkage

假设我有一个这样的课程Foo

foo.h

namespace mine {

class Foo {
  Widget widget_;
public:
  void bar();
  // some other members...
};

} // namespace mine

foo.cpp

#include "foo.h"
namespace mine {

void Foo::bar() {
  // Some very long code
}

} // namespace mine

出于可读性原因,我想将bar()拆分为多个函数。函数本身对Foo(或Foo::bar()以外的任何其他实体)没有任何特殊含义,仅用于拆分bar(),因此根据this的讨论我将在源文件中执行以下操作:

foo.cpp (已重构):

#include "foo.h"

// anonymous namespace to put all helper functions
namespace {

void computeResult() { ... }
void modifyWidget(Widget& w) { ... }
void doThis() { ... }
void doThat(Widget& w) { 
  // ... 
  modifyWidget(w);
}

} // <anonymous> namespace

// actual methods are defined here    
namespace mine {

void Foo::bar() {
  ::doThis();
  ::doThat(widget_);
  ::computeResult();
}

} // namespace mine

因此,我在源文件中定义了一个匿名命名空间,以便定义帮助程序功能,这样我就具有静态链接,并且从源文件外部看不到帮助程序功能。在我看来奇怪的一件事是,类方法依赖于不属于类的函数,但是如果这是一个问题,那么我们将无法使用标准库。

  • 这种方法明智吗?您有更好的建议吗?
  • 将私有成员Foo::widget_传递到修改它的某些独立功能(doThat())时是否存在问题?我在这里假设在静态链接帮助器函数的狭窄上下文中,调用者/被调用者知道他们在做什么。

1 个答案:

答案 0 :(得分:0)

  1. 是的,这很明智。这也很常见,我的印象是它越来越受欢迎。
  2. 链接对函数的工作方式没有任何影响,并且私有成员变量的工作方式与所有其他变量完全一样(除非您无法从外部访问其名称)。
    也就是说,这就像将任何变量传递给任何函数一样。