典型的なC ++コードは次のとおりです。
foo.hpp
#pragma once
class Foo {
public:
void f();
void g();
...
};
foo.cpp
#include "foo.hpp"
namespace {
const int kUpperX = 111;
const int kAlternativeX = 222;
bool match(int x) {
return x < kUpperX || x == kAlternativeX;
}
} // namespace
void Foo::f() {
...
if (match(x)) return;
...
それはまともな慣用的なC ++コードのように見えます-クラス、そのヘルパー関数のいくつかの定数match
によって使用されるFoo
ヘルパー関数。
そして、テストを書きたいです。
それはmatch
全く自明ではないので、別個の単体テストを記述することは完全に論理的です。
ただし、匿名の名前空間に存在します。
もちろん、私は呼び出すテストを書くことができますFoo::f()
。しかし、Foo
重くて複雑な場合、良いテストにはなりません。そのようなテストは、他の無関係な要因から被験者を隔離しません。
そのmatch
ため、匿名の名前空間から移動する必要があります。
質問:関数や定数をテストで使用できなくする場合、匿名の名前空間に関数や定数を入れる意味は何ですか?
friend
その目的のためにキーワードを乱用することは推奨されないという、多くの専門家の大きなコンセンサスがあります。メソッドの制限が、それ以上直接テストできない状況につながる場合、プライベートメソッドが役に立たないことを意味します。
foo.cpp
ヘッダーではなくにあります!OPは、ヘッダーにanon名前空間を入れてはならないことをよく理解しているようです。