ヘッダーファイルでのみクラスを宣言して実装することの違いは、ヘッダーのprotypeクラス効果的な.cppファイルを実装します。.hファイル内または.cppファイル内でのクラスの実装の違い
// File class.h
class MyClass
{
private:
//attributes
public:
void method1(...);
void method2(...);
...
};
//file class.cpp
#include "class.h"
void MyClass::method1(...)
{
//implementation
}
void MyClass::method2(...)
{
//implementation
}
とばかりのヘッダアプローチ:
// File class.h
class MyClass
{
private:
//attributes
public:
void method1(...)
{
//implementation
}
void method2(...)
{
//implementation
}
...
};
私が主な違いを得ることができ、私は通常のアプローチの違いを意味について話しているものをよりよく説明すること
: 2番目のケースでは、コードは同じ実装のインスタンスをさらに生成する必要がある他のすべてのファイルに含まれているため、暗黙の冗長性があります。最初のケースではコードはそれ自身でコンパイルされ、MyClass
のオブジェクトに参照されるすべてのコールはclass.cpp
の実装にリンクされます。
他の違いはありますか?状況に応じて別のアプローチではなくアプローチを使用するほうが便利でしょうか?また、メソッドの本体をヘッダファイルに直接定義することは、そのメソッドをインライン化するためのコンパイラへの暗黙の要求です。
適切なプリプロセッサガードをお持ちの場合、同じインプリメンテーションのインスタンスがそれ以上作成されません。 –
あなたは#ifndef _CLASS_H_ #define _CLASS_H_などについて話していますか? – Jack
@Andrew:確かに、それは2つになります。cppファイルには同じヘッダーが含まれており、プリプロセッサのガードに関係なく内容が完全にコンパイルされ、コンパイルされたコンテンツは出力オブジェクトファイルに存在します。重複はリンカーによってのみ削除されます。プリプロセッサガードは、翻訳ユニット間で共有するのではなく、単一の翻訳ユニットでヘッダーの二重包含を正常に処理する必要があります。 –