2016-06-13 26 views
1

UIHandling.hというヘッダーファイル内にUIHandlingというクラスがあります。エラーLNK2005:コンストラクタが既に定義されています

#ifndef _UIH_ 
#define _UIH_ 

をそしてもちろん、このヘッダファイルは、コンストラクタのすべての実装で構成#endif

でファイルを終了: クラスのトップで私は使用して確認しました。 私は私のプログラムで多くのファイルで、このクラスが含まれてきましたが、何らかの理由で、私は次のコンパイラエラーを取得する:

1>CompaniesMap.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(enum eType)" ([email protected]@[email protected]@@@Z) already defined in Bond.obj 
1>CompaniesMap.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(void)" ([email protected]@[email protected]) already defined in Bond.obj 
1>Company.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(enum eType)" ([email protected]@[email protected]@@@Z) already defined in Bond.obj 
1>Company.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(void)" ([email protected]@[email protected]) already defined in Bond.obj 
1>Date.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(enum eType)" ([email protected]@[email protected]@@@Z) already defined in Bond.obj 
1>Date.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(void)" ([email protected]@[email protected]) already defined in Bond.obj 
1>GovStock.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(enum eType)" ([email protected]@[email protected]@@@Z) already defined in Bond.obj 
1>GovStock.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(void)" ([email protected]@[email protected]) already defined in Bond.obj 
1>main.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(enum eType)" ([email protected]@[email protected]@@@Z) already defined in Bond.obj 
1>main.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(void)" ([email protected]@[email protected]) already defined in Bond.obj 
1>Stock.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(enum eType)" ([email protected]@[email protected]@@@Z) already defined in Bond.obj 
1>Stock.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(void)" ([email protected]@[email protected]) already defined in Bond.obj 
1>D:\Asaf\C\VS\hw5\HW5\Debug\HW5.exe : fatal error LNK1169: one or more multiply defined symbols found 

だから私はの実装と同様に奇妙な何かが(ありますかどうかを確認するためにBond.hBond.cppに行ってきましたUIHandling::UIHandling()など)、そうではありません。

別の質問で、ODRに違反したときにこのエラーが発生することがわかりましたが、私はそうしませんでした。 In another similar question答えは、同じファイルを何度も何度も繰り返してコンストラクタのさまざまな実装を引き起こすことと関係がありますが、これは#ifndef _UIHコマンドを使用することを避けています。すべてのヘルプ

class UIHandling : public exception 
{ 
public: 
    UIHandling();   // Default C'tor - error unknown 
    UIHandling(eType);  // C'tor with error type 
    template <class T> 
    UIHandling(eType, T); // C'tor with error type and relevant number 
... 
} 
... 
UIHandling::UIHandling() 
{ 
... 
} 

UIHandling::UIHandling(eType e) 
{ 
... 
} 

template <class T> 
UIHandling::UIHandling(eType e, T number) 
{ 
... 
} 

UIHandling.hで :

それは私が宣言し、私の​​コンストラクタを定義する方法とは何かを持っていること?

+0

"答えは、同じファイルを何度も繰り返してコンストラクタを実装することと何か関係がありますが、#ifndef _UIHコマンドを使用することは避けられます。 - あなたはその答えを誤解しています。いいえ、 '#ifndef _UIH'は同じヘッダファイルが複数のソースファイルに含まれるのを防ぎません。 – hvd

+0

それでは何ができますか? – PanthersFan92

+0

同じヘッダファイルが1つのソースファイルに複数回含まれないようにします。 – hvd

答えて

0

クラス外とヘッダー内でメンバー関数を定義する場合は、inlineキーワードを使用し、ヘッダーの内容が翻訳単位ごとに1回だけ含まれていることを確認する必要があります(つまり、cppファイルごとにヘッダーガードを含むか、#pragma once)。

class UIHandling : public exception 
{ 
public: 
    UIHandling(); 
    // ... 
}; 

inline // << add this... 
UIHandling::UIHandling() 
{ 
} 

inlineのcpp参照。

+0

なぜですか?なぜ、 '#pragma once'や'#ifndef'を一番上に置いていれば、何度でも 'UIHandling.h'を何回も含めることができませんか? – PanthersFan92

+0

@ PanthersFan92。あなたができることは、コンテンツに重点を置いています。私はそれをより明確にするために編集します。インクルードガードは、コンテンツが既にTUに存在する場合に削除されることを保証します。 – Niall

+0

しかし、私は '#ifndef'を使いましたが、なぜ' 'inline'を使う必要がありますか?これらの実装は2回発生しません。 – PanthersFan92

関連する問題