3

私がプロジェクトを持っている場合

main .cpp 
Knife .h and .cpp
Cucumber .h and .cpp 

キュウリでナイフのメンバーを使用したいのですが、次のものを使用するかどうかは重要です。

#include "Knife.h"
#include <iostream>
using namespace std;

Cucumber.hまたはCucumber.cpp(Cucumber.cppにはすでにCucumber.hのインクルードがあると想定)?

4

4 に答える 4

3

ヘッダーファイルに含まれるファイルの数を最小限に抑えることをお勧めします。したがって、選択肢があれば、ソースファイルに含めることをお勧めします。

ヘッダーファイルを変更する場合は、このヘッダーファイルを含むすべてのファイルを再コンパイルする必要があります。

したがって、cucumber.hincludes knife.hmain.cppincludes cucumber.h、およびを変更した場合knife.h、すべてのファイルが再コンパイルされます(、、cucumber.cppおよびknife.cppmain.cpp

includeとcucumber.cppincludesの場合、を変更すると、とのみが再コンパイルされるため、コンパイル時間が短縮されます。knife.hmain.cppcucumber.hknife.hcucumber.cppknife.cpp

きゅうりにナイフを使用する必要がある場合は、次のように進めることができます。

// Cucumber.hpp
#ifndef CUCUMBER_HPP
#define CUCUMBER_HPP

class Knife;

class Cucumber
{
public :
///...
    private :
    Knife* myKnife
}
#endif

//Cucumber.cpp
#include "Cucumber.hpp"
#include "Knife.hpp

// .. your code here

この「トリック」は「前方宣言」と呼ばれます。これは、コンパイル時間を最小限に抑えたいC++開発者のよく知られたトリックです。

于 2012-08-14T11:33:39.220 に答える
2

はい、ファイルに入れる必要があり.cppます。

ビルドが速くなり、依存関係が少なくなり、アーティファクトとノイズが少なくなります。iostreamの場合、GCCは次のように宣言します。

// For construction of filebuffers for cout, cin, cerr, clog et. al.
static ios_base::Init __ioinit;

名前空間内stdKnife.hその宣言は、多くのファイルに含まれている場合、起動時に構築する必要がある大量の(冗長な)静的データを生成します。したがって、多くのメリットがありますが、唯一の欠点は、実際に必要なファイルを明示的に含める必要があることです。つまり、必要なすべての場所にファイルを含める必要があります(これはいくつかの点で非常に良いことでもあります)。

于 2012-08-14T11:41:02.920 に答える
1

私が提唱しているアドバイスは、特定のソースファイルに必要な最小限のファイルのみを含め、できるだけ多くのインクルードをヘッダーから除外することでした。コンパイル時に依存関係が減少する可能性があります。

注意すべきもう1つのことは、名前空間の使用法です。あなたは間違いなくそのようなものをヘッダーに入れることに注意したいです。計画していないファイルの名前空間の使用法が変更される可能性があります。

于 2012-08-14T11:34:46.087 に答える
1

原則として、次の理由により、ヘッダーではなくインクルードを実装ファイルに追加してみてください。

  • 潜在的な不要な包含を減らし、必要な場所にのみ保持します。
  • コンパイル時間を短縮します(私が見た場合にはかなりの場合があります)。実装の詳細を過度に公開することを回避します。
  • 循環依存が表示されるリスクを軽減します。
  • ヘッダーのユーザーが、望まない/必要のないファイルを間接的に含める必要がないようにします。

ポインタでクラスを参照する場合、またはヘッダーのみを参照する場合は、適切なヘッダーを含める必要はありません。クラス宣言で十分です。

おそらく他にもかなりの理由があります-上記はおそらく最も重要で明白な理由です。

于 2012-08-14T11:46:53.513 に答える