3

特定の名前空間内に、単体テストでカバーされている無料の関数がたくさんあるとしましょう。そして、別の無料の機能に移動できるいくつかの一般的な機能があるとしましょう。この新しい機能が非表示になるようにするにはどうすればよいですか? つまり、この関数は、前述の無料の関数でのみ使用し、他の場所では使用しないでください。無料関数の名前空間の下の名前空間に追加する必要がありますか。もしそうなら、私は名前空間を何と呼ぶべきですか - 命名規則はありますか?

また、この新しい関数は単体テストされている他の関数によって内部的に使用されるため、単体テストされていないことも指摘しておく必要があります。おそらく私は怠け者であり、この質問に対する解決策は、この関数も単体テストするだけで、必要に応じて人々が使用できるようにすることです。

4

2 に答える 2

3

非表示にすることができます。クラスのプライベート静的メンバー関数にしてから、各インライン関数を明示的にフレンドリングします。実装はインラインまたはオフラインである可能性がありますが、アクセス制御は引き続き機能します。

ただし、アクセスを制限する必要がない限り、Boostの規則に従い、 detail(または同様の)と呼ばれるネストされた名前空間に配置します。これは、安定したパブリックインターフェイスではなく、実装の詳細であることを文書化することを目的としています(もちろん、名前空間の汚染を回避するためです)。

これにより、各無料関数をフレンドとして明示的にリストする必要もなくなります。

于 2012-11-22T12:33:51.650 に答える
1

クラスのプライベート セクションでヘルパー関数を静的関数として保持し、それを使用できる関数のみをフレンドリにすることができます。

class Foo
{
    static int helper() {return 0;}
    friend void baz();
};

void baz()
{
    Foo::helper(); //compiles
}

void buz()
{
    Foo::helper(); //doesn't compile
}
于 2012-11-22T12:31:27.933 に答える