C++初心者です。
ほぼ触ったことがないので、細かい部分も教えていただきたいです。
C++を使用して試しにログを出力するプログラムを作成しています。
以下のクラスでリンクエラーが出てしまいます。
静的なメンバーを初期化し、初期化したメンバーを
cppファイル側で使用するように実装していますが、
Log.objですでに定義されていると言われてしまいます。
エラー 5 error LNK2005: "public: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const Log::CATEGORY_ERROR" (?CATEGORY_ERROR@Log@@2V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@B) は既に Log.obj で定義されています。 プロジェクト.obj プロジェクト
実現したいこととしてはconst static のstring型の固定文字(sub1)を
変数で保持しておき、保持している値をLog.cppに書いている
メソッドで使用したいです。
const static std::string CATEGORY_ERROR = "sub1";
(CATEGORY_ERRORをLog.cpp内のメソッドで使用したい。)
①なぜ本リンクエラーが出るのでしょうか。
②どのような実装にすれば上記を実現出来るでしょうか。
現在の実装コードを以下に記載します。
■Log.h
C++
1#pragma once 2#include<log4cpp/Category.hh> 3#include<log4cpp/PropertyConfigurator.hh> 4 5class Log 6{ 7private: 8 9public: 10 Log(); 11 ~Log(); 12 ///ログ出力に関する設定ファイルのファイル名 13 const static std::string PROPATIES_FILE_NAME;// = "log4cpp.properties"; 14 const static std::string CATEGORY_ERROR;//= "sub1"; 15 const static std::string CATEGORY_INFO;// = "sub1.sub2"; 16 const static std::string CATEGORY_DEBUG;// = "sub1.sub2.sub3"; 17 18 log4cpp::Category& root = getErrorFatalLogger();//仮 19 log4cpp::Category& sub1 = getErrorFatalLogger(); 20 log4cpp::Category& sub3 = getInfoWarnLogger(); 21 log4cpp::Category& sub2 = getDebugLogger(); 22 23 static log4cpp::Category& getErrorFatalLogger(); 24 static log4cpp::Category& getInfoWarnLogger(); 25 static log4cpp::Category& getDebugLogger(); 26 static log4cpp::Category& getPerformanceLogger(); 27 28}; 29// 30const std::string Log::PROPATIES_FILE_NAME = "log4cpp.properties"; 31const std::string Log::CATEGORY_ERROR = "sub1"; 32const std::string Log::CATEGORY_INFO = "sub1.sub2"; 33const std::string Log::CATEGORY_DEBUG = "sub1.sub2.sub3";
■Log.cpp
C++
1#include "stdafx.h" 2#include "Log.h" 3Log::Log() 4{ 5 log4cpp::PropertyConfigurator::configure(PROPATIES_FILE_NAME); 6 log4cpp::Category& sub3 = log4cpp::Category::getInstance(CATEGORY_DEBUG); 7 log4cpp::Category& sub2 = log4cpp::Category::getInstance(CATEGORY_INFO); 8 log4cpp::Category& sub1 = log4cpp::Category::getInstance(CATEGORY_ERROR); 9} 10Log::~Log() 11{ 12} 13///DDEBUGのログ出力に使用 14log4cpp::Category& Log::getDebugLogger() 15{ 16 return log4cpp::Category::getInstance(CATEGORY_DEBUG); 17} 18///INFOおよびWARNのログ出力に使用 19log4cpp::Category& Log::getInfoWarnLogger() 20{ 21 return log4cpp::Category::getInstance(CATEGORY_INFO); 22} 23///ERRORおよびFATALのログ出力に使用 24log4cpp::Category& Log::getErrorFatalLogger() 25{ 26 return log4cpp::Category::getInstance(CATEGORY_ERROR); 27} 28//パフォーマンスのログ出力に使用 29log4cpp::Category& Log::getPerformanceLogger() 30{ 31 return log4cpp::Category::getInstance(CATEGORY_DEBUG); 32}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/15 00:32