を含めます。 プログラムはうまくいきましたが、今度はクラスLoggerでもオブジェクトUtilを使う必要があります。 しかし、コードを#include "Util.cpp"に入れると、g ++はオブジェクトを再び呼び出すことができないのでエラーが出ます。 EclipseはUtilのクラスの "再定義"と "以前の宣言"について教えてくれました。は、私は4つのクラスを持っているC++でのさまざまなファイルで複数回クラス
どうすればこの問題を解決できますか?
を含めます。 プログラムはうまくいきましたが、今度はクラスLoggerでもオブジェクトUtilを使う必要があります。 しかし、コードを#include "Util.cpp"に入れると、g ++はオブジェクトを再び呼び出すことができないのでエラーが出ます。 EclipseはUtilのクラスの "再定義"と "以前の宣言"について教えてくれました。は、私は4つのクラスを持っているC++でのさまざまなファイルで複数回クラス
どうすればこの問題を解決できますか?
ソースcppファイルを別のcppファイルに含めないでください。
これは基本的にOne Definition Ruleに違反し、再定義の誤りが発生します。
オブジェクトを作成するクラスに、Util
クラスの定義を持つヘッダーファイルを含めます。基本的に、あなたのコードは、この方法で整理する必要がある
(例外:テンプレート化コード):
Util.h ----------->としてクラスUtil
行為の定義が含まれていますインタフェース
util.cppを ----------->あなたはCLのオブジェクトを作成したいときにここで実装としてクラスUtil
行為
の実装が含まれていますコンパイラはUtil
の定義を知っているので、そのcppファイルにUtil.h
を含めるcppファイルのいずれかにUtil
と入力してください。 EXのために
:
Server.cpp
がUtil
のオブジェクトを作成したい、あなたのServer.cpp
はとしてUtil.h
を含める必要があります。
#include "Util.h"
また、あなたのヘッダファイルにInclude guardsを追加することを忘れないでください。
別のソース/ヘッダファイルによってUtil
の利用はUtil
へのポインタを作成することに制限されているなら、あなたはあなたが唯一のForward declareにUtil
クラスを必要とする、ヘッダーファイルをインクルードする必要はありません。
私はそれを得ました。 私の場合は、Logger.hでUtil.cppで使用するオブジェクトUtilを作成する必要があります。 どうすれば可能ですか? – user1056635
@ user1056635: 'Logger.h'に' Util.h'をインクルードします。私は上記の答えで同じことを説明しました。あなたがこの質問をしているのなら、あなたは私の答えを理解したとは思わないでしょう。 *理解して**それを、あなたがundestandしなければ何か**尋ねる**。 –
ok私はそれを得ました。 ありがとうございます:) – user1056635
クラスを.h
個のファイル(または.hpp
)で宣言し、実装を `.cpp 'ファイルに入れます。
あなただけが.cpp
ファイルを含めることはありません、他の.h
/.hpp
または.cpp
ファイル内のファイルは、.h
/.hpp
が含まれます。
ヘッダファイルの最初の行.h
/.hpp
あるべき、すべてのヘッダファイルが複数のインクルージョンから防ぐためのガードを持っていることを確認してください:
#pragma once
あなたはたとえばUtil.h
のために、唯一のヘッダファイルを入力する必要はなく、 .cppファイル。また、インクルードガードを使用していることを確認してください。コンパイラが複数の定義に対してエラーを出す場合は、おそらくあなたがインクルードガードを見逃してしまったでしょう。
http://en.wikipedia.org/wiki/Include_guard – Anycorn
コードは一度だけ含める必要があります。 '#pragma once' –
テンプレートは含まれてはいけません(テンプレートでない限り、ここではそうではありません)!宣言を含むヘッダーファイルのみを常に含めます。 – codeling