私の宿題はクラスをインラインで宣言するように指示していますが、インラインで関数を宣言しているだけです。インラインクラス宣言は何を行い、どのように達成するのですか?クラスをインラインでどのように宣言しますか?
答えて
私は、あなたのクラスがヘッダーに入るべきだと言っていると思います。便宜上、すべてのクラスメソッドはクラスメソッドをインラインで宣言してください。 CPP。
これはやや曖昧ですが、それが私の解釈方法です。関数やクラスを比較
正確にどのように解釈していますか?しかし、上記のコメントの中で「みんなの命をはるかに簡単にする」というのは経験則ではない。非常に小規模なクラスのほうが便利かもしれませんが、ほとんどの場合、それは成立しません。 – Correa
:
関数は宣言と定義することができ:
を関数宣言は、誰もが関数を呼び出すために望んでいる人に必要なすべての情報を提供します。
関数定義では、コンパイラは機械コードを生成し、誰かが関数を呼び出すと、呼び出される実行可能ファイルのどこかに命令があるようにすることができます。
この生成コードは、実行可能ファイルに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ファイルに入れるだけで解決できます。
- 1. Predicate Delegateをインラインでどのように宣言しますか?
- 2. どのようにクラスをJavascriptで宣言しますか?
- 3. 型エイリアスをスカラーコンストラクタでどのように宣言しますか?
- 4. この関数をどのように宣言しますか?
- 5. クラスと同じデータ型のクラスで、どのようにして静的メンバーを宣言できますか?
- 6. AS3グローバル変数をどのように宣言しますか?
- 7. アロケータをどのように宣言しますか?
- 8. どのようにtypedefされたクラスを宣言するのですか?
- 9. Ruby - プライベートメソッドのインライン宣言
- 10. __sync_fetch_and_addはどのように宣言しますか?
- 11. C++では、クラスによって使用される配列をどのように宣言しますか?
- 12. クラス定数をどこで宣言しますか?
- 13. インライン構造体宣言
- 14. インライン定義と宣言
- 15. サブクラスで宣言せずにコンストラクタを使用できるように、コンストラクタを基底クラスで宣言するにはどうすればよいですか?
- 16. 前方宣言されたテンプレートの基本クラスから派生したクラスを宣言するにはどうすればよいですか?
- 17. どのようにしてVB_DATEでMAX_DOUBLEを宣言しますか?
- 18. Flaskどのようにsqlalchemyをinit_db()で宣言的に使用しますか?
- 19. PHPで宣言されたクラス宣言を含むクラス宣言PHPコードスニファ
- 20. オブジェクト配列をJavaでどのように宣言しますか?
- 21. カピバラではどのように文字列を宣言しますか?
- 22. クラスエクステンションで宣言された変数にどのようにアクセスしますか?
- 23. クラスの宣言
- 24. mysqlはストアドプロシージャの外ではどのように宣言しますか?
- 25. JavaScriptで親クラスと子クラスを宣言するにはどうすればよいですか?
- 26. TreeMap - SortedMapまたはMapをどのように宣言しますか?
- 27. C#クラスの宣言で「どこ」が意味するのでしょうか?
- 28. クラス宣言とインスタンス宣言の型キーワード
- 29. どのように変数をグローバルに宣言しますか?ケースforeach? Javascript
- 30. より美しいTypeScriptの匿名クラス宣言ですか?
質問全体を投稿できますか?正直なところ「インラインクラス」は複数のことを意味することがあります。同様に、クラス内のクラス宣言、または関数内のクラス宣言(どちらも実行可能で、ユースケースを持つことができます)。 – StilesCrisis
@StilesCrisis "すべての式クラス宣言は、expressions.hhというヘッダーファイルに記述する必要があります(すべてのクラスをインラインで宣言すると、すべての人の生活がはるかに楽になります)。" –
彼らはあなたのクラスがヘッダーに入るべきだと言っているだけであり、便宜上、すべてのクラスメソッドはクラスメソッドをインラインで宣言するか、クラスメソッドをアウトラインにするか別のCPPに入れるべきです。それはやや曖昧ですが、それは私がそれを解釈する方法です。 – StilesCrisis