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
嗨非常感謝Dauphic的回覆。我仍然有些困惑。您能否就我寫的代碼詳細說明您的句子,「標題保護僅保護您的標題不會被包含在同一個翻譯單元中;它們不會阻止它們被不同的翻譯單元包括在內。」 在此先感謝。 –
我有一個錯字;頭文件只保護您的頭文件不會被__多於一次_包含在同一個翻譯單元中。您編譯的每個.cpp文件都是一個翻譯單元,並且可以包含一次'dummymessage.h'。每個包含它的.cpp文件都會自己定義CDummyMessage :: ObjCount1,所以當鏈接器嘗試將它們鏈接在一起時,它不知道要使用哪一個。 –
你的建議對我有效,現在你的解釋對我來說也很清楚..謝謝。 –