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

//ダミーメッセージ.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" (?ObjCount1@CDummyMessage@dummy@@0HA) already defined in DummyMessage.obj  C:\Users\Veil\documents\visual studio 2012\Projects\SmartPointerExample\SmartPointerExample\SmartPointerExample.obj
4

1 に答える 1

1

CDummyMessage::ObjCount1定義をソース ファイルに移動します。

ヘッダー ガードは、ヘッダーが同じ翻訳単位に複数回含まれないように保護するだけです。それらは、異なる翻訳単位に含まれることを妨げません。

現在、dummymessage.hヘッダーを含む各翻訳単位は を定義していますCDummyMessage::ObjCount1。コンパイラがすべてのコードをリンクしようとすると、複数のオブジェクト ファイルに の定義が含まれていることがわかりますCDummyMessage::ObjCount1

于 2013-10-02T18:54:19.917 に答える