2011-12-28 8 views
2

を含めます。 プログラムはうまくいきましたが、今度はクラスLoggerでもオブジェクトUtilを使う必要があります。 しかし、コードを#include "Util.cpp"に入れると、g ++はオブジェクトを再び呼び出すことができないのでエラーが出ます。 EclipseはUtilのクラスの "再定義"と "以前の宣言"について教えてくれました。は、私は4つのクラスを持っているC++でのさまざまなファイルで複数回クラス

どうすればこの問題を解決できますか?

+0

http://en.wikipedia.org/wiki/Include_guard – Anycorn

+0

コードは一度だけ含める必要があります。 '#pragma once' –

+0

テンプレートは含まれてはいけません(テンプレートでない限り、ここではそうではありません)!宣言を含むヘッダーファイルのみを常に含めます。 – codeling

答えて

7

ソースcppファイルを別のcppファイルに含めないでください。
これは基本的にOne Definition Ruleに違反し、再定義の誤りが発生します。

オブジェクトを作成するクラスに、Utilクラスの定義を持つヘッダーファイルを含めます。基本的に、あなたのコードは、この方法で整理する必要がある

(例外:テンプレート化コード):

Util.h ----------->としてクラスUtil行為の定義が含まれていますインタフェース
util.cppを ----------->あなたはCLのオブジェクトを作成したいときにここで実装としてクラスUtil行為

の実装が含まれていますコンパイラはUtilの定義を知っているので、そのcppファイルにUtil.hを含めるcppファイルのいずれかにUtilと入力してください。 EXのために


Server.cppUtilのオブジェクトを作成したい、あなたのServer.cppはとしてUtil.hを含める必要があります。

#include "Util.h" 

また、あなたのヘッダファイルにInclude guardsを追加することを忘れないでください。

別のソース/ヘッダファイルによってUtilの利用はUtilへのポインタを作成することに制限されているなら、あなたはあなたが唯一のForward declareUtilクラスを必要とする、ヘッダーファイルをインクルードする必要はありません。

+0

私はそれを得ました。 私の場合は、Logger.hでUtil.cppで使用するオブジェクトUtilを作成する必要があります。 どうすれば可能ですか? – user1056635

+0

@ user1056635: 'Logger.h'に' Util.h'をインクルードします。私は上記の答えで同じことを説明しました。あなたがこの質問をしているのなら、あなたは私の答えを理解したとは思わないでしょう。 *理解して**それを、あなたがundestandしなければ何か**尋ねる**。 –

+0

ok私はそれを得ました。 ありがとうございます:) – user1056635

0

クラスを.h個のファイル(または.hpp)で宣言し、実装を `.cpp 'ファイルに入れます。

あなただけが.cppファイルを含めることはありません、他の.h/.hppまたは.cppファイル内のファイルは、.h/.hppが含まれます。

ヘッダファイルの最初の行.h/.hppあるべき、すべてのヘッダファイルが複数のインクルージョンから防ぐためのガードを持っていることを確認してください:

#pragma once 
1

あなたはたとえばUtil.hのために、唯一のヘッダファイルを入力する必要はなく、 .cppファイル。また、インクルードガードを使用していることを確認してください。コンパイラが複数の定義に対してエラーを出す場合は、おそらくあなたがインクルードガードを見逃してしまったでしょう。