0

公的にアクセス可能である必要があるいくつかの関数と、このソースファイルでのみ使用されるいくつかのサポート関数を含む.cppソースファイルがあります。

クラスが提供するすべてのものを1つの場所で確認すると個人的に便利だと思うので、これらすべての関数宣言をヘッダーファイルに入れています。ただし、関数がアクセス修飾子と同様に内部使用であるかどうかを示したいと思いますが、privateクラスは使用していません(これらはスタンドアロン関数です)。

考えられる解決策は次のとおりです。

  • プライベート宣言をソースファイルに入れます。
  • プライベート宣言を別のヘッダーに配置します。

これらのソリューションはどちらも、パブリック関数とプライベート関数を別々のファイルに分割しますが、これは避けたいと思います。

4

4 に答える 4

6

関数が公共の使用を意図していない場合は、ヘッダーに配置しないでください。それらが使用されているソースファイルに入れます。

これらの関数がソース ファイルの外部で使用されないように完全に隠すには、通常、次のいずれかを実行します。

  • 関数は として宣言されstaticます。
  • 関数は名前のない に入れられnamespaceます。

後者が望ましいと考えられています。実際、C++ 標準 7.3.1.1 には次のように記載されています。

名前空間スコープでオブジェクトを宣言する場合、static キーワードの使用は非推奨です。無名名前空間は優れた代替手段を提供します。

名前のない名前空間と静的に関する詳細については、名前のない名前空間と静的関数の比較および対応するcomp.lang.c++.moderated threadを参照してください。

于 2012-05-22T10:52:04.397 に答える
3

プライベート関数が単一のソースファイルでのみ使用される場合は、追加のヘッダーファイルは必要ありません。関数にマークを付けるかstatic、匿名を使用するだけnamespaceです。

関数を多くのソースファイルから使用できる場合は、特別なの別のヘッダーファイルでそれらを宣言しますnamespace。それが私のアドバイスです。

于 2012-05-22T10:54:10.143 に答える
0

サポート関数の宣言はどこに行けばよいですか?

彼らはどこにも行く必要はありません。それらを静的にして、ソースファイルに保持します。それらが単一のソース ファイルでのみ使用されている場合は、前方宣言をヘッダーに入れる必要はありません。

于 2012-05-22T11:41:59.617 に答える
0

これらの「関数」がクラスのメンバーであるかどうかについては言及していませんが、そうであると仮定します。もしそうなら、「pimpl idiom」を見ることをお勧めします。基本的にこれは、非公開にしたいもののすべてまたはほとんどを別のクラスに入れ、クラス宣言でクラスのインスタンスへのポインターのみを持つことを意味します。例えば:

class MyClass
{
    // ... some stuff
private:
    SecretObject obj_;
    int hiddenCall();
};

になる

class MyClassImpl;

class MyClass
{
private:
    MyClassImpl* impl_;
};

アイデアは、実装クラスのすべての宣言と定義が .cpp ファイルに入り、コンパイル単位以外から隠されるということです。このアプローチには、多くの重要な利点があります。

  • 実装を非表示にして、公開されているヘッダーが実装の多くを提供しないようにします。
  • ヘッダーの依存関係を削除することでコンパイル速度を上げることができます - v. ヘッダーが多く含まれている場合は重要です。
  • データベース API などに対してビルドする必要のないライブラリに対して、クライアント コードを「隔離」するのに役立ちます。

いくつかの欠点があります。

  • コードが cpp ファイルに隠されている場合、単体テストがより難しくなる可能性があります。個人的には、コードのクライアントが取得するものを制御できるように、個別のプライベート ヘッダーと実装ファイルを用意し、テスト ハーネスで適切にテストすることがより良い解決策だと思います。MyClassImplcpp ファイルにヘッダーを単純に含めることができますが、ヘッダーに含めないでくださいMyClass。これにより、オブジェクトが無効になります。
  • との間の間接性はMyClassMyClassImplコーディングや管理が面倒になる可能性があります。

ただし、一般的には、目的を達成するためのおそらく最良の方法です。より詳細な説明については、Herb Sutter の記事を参照してください。

一方、クラスに直接関係のないfree functionsについて話している場合は、これらを cpp ファイル内の名前のない名前空間に配置します。例えば:

namespace {

    // Your stuff goes here.

};

繰り返しますが、このアプローチを採用した場合にこれらの関数にアクセスする方法の単体テストの問題がありますが、それが本当に問題である場合は、おそらく特定の名前空間や条件付きコンパイルなどを作成することで、これを回避することができます。理想的ではありませんが、可能。

于 2012-05-22T12:15:27.823 に答える