2013-10-02 50 views
0

我正在爲靜態數據成員的多個聲明獲取鏈接錯誤。我採取了所有必要的預防措施以避免包含頭文件,但仍然出現錯誤。靜態數據成員的乘法聲明的鏈接錯誤

//dummymessage.h 
#ifndef DUMMY_MESSAGE 
#define DUMMY_MESSAGE 

#pragma once 

#include "stdafx.h" 
#include "string" 

class CDummyMessage 
    { 
    private: 
     static int CDummyMessage::ObjCount1; 
    public: 

     CDummyMessage(void); 
     CDummyMessage(std::string content, int type); 
     ~CDummyMessage(void); 
    private: 
     std::string m_Message_content; 
     int m_type; 
}; 

    int CDummyMessage::ObjCount1 = 0; 
#endif 

//dummymessage.cpp

#include "stdafx.h" 
#include "iostream" 
#include "DummyMessage.h" 

using namespace dummy; 
CDummyMessage::CDummyMessage(void) 
{ 
std::cout<<"Constructor called. ID: "<<++CDummyMessage::ObjCount1<<std::endl; 
} 


CDummyMessage::~CDummyMessage(void) 
{ 
std::cout<<"Destructor called. ID: "<<--CDummyMessage::ObjCount1<<std::endl; 
} 
CDummyMessage::CDummyMessage(std::string content, int type): 
m_Message_content(content) 
{ 
} 

//main.cpp

#include "stdafx.h" 
#include "windows.h" 
#include "list" 
#include "process.h" 
#include "iostream" 
#include "DummyMessage.h" 


using namespace std; 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
for(auto i = 0;++i < 10000;){ 
     CDummyMessage* l_pNewMsg = new CDummyMessage("Test message", i); 
     g_Message_queue.push_front(l_pNewMsg); 
    } return 0; 

} 

我正在爲這個鏈接錯誤: -

Error 1 error LNK2005: "private: static int dummy::CDummyMessage::ObjCount1" ([email protected]@[email protected]@0HA) already defined in DummyMessage.obj C:\Users\Veil\documents\visual studio 2012\Projects\SmartPointerExample\SmartPointerExample\SmartPointerExample.obj 

回答

1

移動你的CDummyMessage::ObjCount1定義到源文件。

標題保護只保護您的標題被多次包含在同一翻譯單元中;他們不妨礙他們被不同的翻譯單位包括在內。

當前,包含您的dummymessage.h標頭的每個翻譯單元都定義了CDummyMessage::ObjCount1。當編譯器試圖將所有代碼鏈接在一起時,它會發現多個目標文件包含CDummyMessage::ObjCount1的定義。

+0

嗨非常感謝Dauphic的回覆。我仍然有些困惑。您能否就我寫的代碼詳細說明您的句子,「標題保護僅保護您的標題不會被包含在同一個翻譯單元中;它們不會阻止它們被不同的翻譯單元包括在內。」 在此先感謝。 –

+1

我有一個錯字;頭文件只保護您的頭文件不會被__多於一次_包含在同一個翻譯單元中。您編譯的每個.cpp文件都是一個翻譯單元,並且可以包含一次'dummymessage.h'。每個包含它的.cpp文件都會自己定義CDummyMessage :: ObjCount1,所以當鏈接器嘗試將它們鏈接在一起時,它不知道要使用哪一個。 –

+0

你的建議對我有效,現在你的解釋對我來說也很清楚..謝謝。 –