在 C++ 中将与 class 方法相关的辅助函数放在哪里
Where to put helper functions pertaining to class method in C++
假设我有一个 class 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
所以我在源文件中定义了一个匿名命名空间以定义辅助函数,这样我就有了静态链接并且辅助函数在源文件外部是不可见的。对我来说奇怪的一件事是 class 方法依赖于不属于 class 的函数,但如果这是一个问题,我们甚至无法使用标准库。
- 这种做法合理吗?你有更好的建议吗?
- 将私有成员
Foo::widget_
传递给某个对其进行修改的独立函数 (doThat()
) 是否存在问题?我在这里假设在静态链接辅助函数的狭窄上下文中,callers/callees 知道他们在做什么。
- 是的,这是明智的。也不少见,我的印象是越来越受欢迎。
- 链接对函数的工作方式没有任何影响,私有成员变量的工作方式与所有其他变量完全相同(除了您无法从外部访问其名称)。
也就是说,它就像将任何变量传递给任何函数一样。
假设我有一个 class 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
所以我在源文件中定义了一个匿名命名空间以定义辅助函数,这样我就有了静态链接并且辅助函数在源文件外部是不可见的。对我来说奇怪的一件事是 class 方法依赖于不属于 class 的函数,但如果这是一个问题,我们甚至无法使用标准库。
- 这种做法合理吗?你有更好的建议吗?
- 将私有成员
Foo::widget_
传递给某个对其进行修改的独立函数 (doThat()
) 是否存在问题?我在这里假设在静态链接辅助函数的狭窄上下文中,callers/callees 知道他们在做什么。
- 是的,这是明智的。也不少见,我的印象是越来越受欢迎。
- 链接对函数的工作方式没有任何影响,私有成员变量的工作方式与所有其他变量完全相同(除了您无法从外部访问其名称)。
也就是说,它就像将任何变量传递给任何函数一样。