2012-03-03 23 views
2

私の宿題はクラスをインラインで宣言するように指示していますが、インラインで関数を宣言しているだけです。インラインクラス宣言は何を行い、どのように達成するのですか?クラスをインラインでどのように宣言しますか?

+0

質問全体を投稿できますか?正直なところ「インラインクラス」は複数のことを意味することがあります。同様に、クラス内のクラス宣言、または関数内のクラス宣言(どちらも実行可能で、ユースケースを持つことができます)。 – StilesCrisis

+0

@StilesCrisis "すべての式クラス宣言は、expressions.hhというヘッダーファイルに記述する必要があります(すべてのクラスをインラインで宣言すると、すべての人の生活がはるかに楽になります)。" –

+1

彼らはあなたのクラスがヘッダーに入るべきだと言っているだけであり、便宜上、すべてのクラスメソッドはクラスメソッドをインラインで宣言するか、クラスメソッドをアウトラインにするか別のCPPに入れるべきです。それはやや曖昧ですが、それは私がそれを解釈する方法です。 – StilesCrisis

答えて

5

私は、あなたのクラスがヘッダーに入るべきだと言っていると思います。便宜上、すべてのクラスメソッドはクラスメソッドをインラインで宣言してください。 CPP。

これはやや曖昧ですが、それが私の解釈方法です。関数やクラスを比較

+3

正確にどのように解釈していますか?しかし、上記のコメントの中で「みんなの命をはるかに簡単にする」というのは経験則ではない。非常に小規模なクラスのほうが便利かもしれませんが、ほとんどの場合、それは成立しません。 – Correa

2

関数は宣言と定義することができ:

​​

を関数宣言は、誰もが関数を呼び出すために望んでいる人に必要なすべての情報を提供します。

関数定義では、コンパイラは機械コードを生成し、誰かが関数を呼び出すと、呼び出される実行可能ファイルのどこかに命令があるようにすることができます。

この生成コードは、実行可能ファイルに1回だけ存在します。通常、関数定義を.cppファイル(またはCを使用している場合は.c、これもそこに適用されます)に入れます。これはコンパイルされ、実行可能ファイルにリンクされます。その.cppファイルがリンクされていない場合は、FunctionName not foundなどのリンカーエラーが表示されます。

関数定義をヘッダーファイルに入れると、ヘッダーがシステムの複数の場所で使用され、ほかの.cppファイルに含まれる可能性が高くなります。これは、リンク時間FunctionName already defined in this, that, or the other object fileで反対の問題を生成します。

通常、ヘッダは複数の.cppファイルに含まれているので、関数は通常、重複したオブジェクトコードを生成するため、ヘッダファイルには関数が定義されていません。

クラスでは少し異なります。クラスの関数を定義するには、2つの異なる方法があります。一つの方法は、機能は上記で定義されているかのようになります。

//myleanklass.h 
class MyLeanKlass 
{ 
public: 
    void perform(); 
}; 

//myleanklass.cpp 
void MyLeanKlass::perform() 
{ 
    // Sing, dance, and play the piano 
} 

我々は限り、それが複数の.cppファイルに含まれていなかったとして、ヘッダファイルに定義を入れることができただけでフリー機能と同じように。それ以外の場合は、同様のリンカエラーが発生しますvoid MyLeanKlass::perform already defined ...このシナリオは一般的ではありません。通常は、クラスを宣言して、システムから再利用できるようにします。したがって、ヘッダーは複数の場所に含まれ、リンカーエラーにつながります。

私たちはヘッダファイルに定義を入れることができましたが、inlineではありません。あなたがお使いのシステムでは、このヘッダを複数回含めることができないだろう。

class MyLeanKlass 
{ 
public: 
    void perform(); 
}; 

void MyLeanKlass::perform() 
{ 
    // Sing, dance, and play the piano 
} 

最後に、その後、我々は、質問への答えを得ます。クラス関数は、クラス宣言内にある限り、ヘッダーファイルで定義できます。これはinline definitionと呼ばれます。ヘッダーが複数の.cppファイルに含まれていても、コンパイル単位で複数の定義につながることはなく、リンカーエラーは発生しません。

  • インラインクラスの機能は、コンパイラは、まだクラス関数のすべての繰り返し定義をコンパイルし、唯一の重複を捨てるだろうと、コンパイルに時間がかかる作るそうです:

    //myleanklass.h 
    class MyLeanKlass 
    { 
    public: 
        void perform() 
        { 
         // Sing, dance, and play the piano 
        } 
    }; 
    

    しかし、このアプローチには問題がありますリンク時。

  • クラス関数を変更すると、それを含む.cppファイルが再コンパイルされ、再コンパイル時間が長くなります。
  • 時にはそれができないこともあります。あるクラスが別のクラスを使用し、それが他のクラスを使用する場合は、循環依存性を持ち、すべてをインラインで定義することはできません。問題の機能を別の.cppファイルに入れるだけで解決できます。
関連する問題