2011-02-04 24 views
2

私は、ロギングプログラムをコンパイルしていますが、私はこのエラーを受けていますし、私の人生のためにそれを把握するカント...私はC++クラス再定義エラー

g++ -Wall logger.cpp -o log 
でコンパイルはgccと

logger.cpp:15: error: redefinition of ‘class Logger’ 
logger.h:20: error: previous definition of ‘class Logger’ 

logger.h:

#ifndef LOGGER_H 
#define LOGGER_H 

#include <fstream> 
#include <iostream> 
#include <string> 
using std::string; 

class Logger 
{ 

static Logger* m_pInstance; 

public: 
static Logger* Instance() { return m_pInstance; } 
void writeLog(string message); 
void openLogFile(string fileName); 
void closeLogFile(); 
void deleteLogger(); 

}; 
#endif 

logger.cpp

#include "logger.h" 

#include <fstream> 
#include <iostream> 

class Logger 
{ 
static Logger* m_pInstance; 
std::ofstream m_pOutputFile; 
Logger() 
{ 
} 
~Logger() 
{ 
} 

public: 
static Logger* Instance() 
{ 
    if(!m_pInstance) 
    { 
     m_pInstance = new Logger; 
    } 
    return m_pInstance; 
} 
void writeLog(std::string message) 
{ 
    m_pOutputFile << message << "\n"; 
    std::cout << "you just wrote " << message << " to the log file!\n" << std::endl; 
} 
void openLogFile(std::string fileName) 
{ 
    m_pOutputFile.open(fileName.c_str(),std::ios::out); 
} 
void closeLogFile() 
{ 
    m_pOutputFile.close(); 
} 
void deleteLogger() 
{ 
    delete m_pInstance; 
} 
}; 
Logger* Logger::m_pInstance = NULL; 

答えて

5

これは、エラーメッセージに表示される内容です。実装ファイルは、クラスメンバ変数と競合する関数本体を追加するだけで、クラスの再定義を提供することはできません。代わりに、既に宣言した関数と静的メンバー変数の定義を提供してください。まあ

+0

私は変更を加えましたが、今はLogger()と〜Logger().............. logger.cpp:17:error:暗黙に宣言された定義'ロガー::ロガー()' logger.cpp:17:エラー:の宣言 'ロガー:: Loggerは()' は異なる例外をスロー logger.h:18:エラー:前の宣言「ロガーから::ロガー()スロー() ' – user603756

+1

もちろん、logger.cppの実装ではヘッダーと同じ署名が必要ですが、そこには 'throw()'も必要です。また、すでにlogger.hファイルに実装されている関数やctor本体を複製しないでください。 – Xeo

1

#include "logger.h" 

#include <fstream> 
#include <iostream> 


static Logger::Logger* m_pInstance; 

Logger::Logger() 
{ 
} 

Logger::~Logger() 
{ 
} 

// this also is illegal, there's a body provided in the header file 
//Logger* Logger::Instance() 
//{ 
// if(!m_pInstance) 
// { 
//  m_pInstance = new Logger; 
// } 
// return m_pInstance; 
//} 

void Logger::writeLog(std::string message) 
{ 
    m_pOutputFile << message << "\n"; 
    std::cout << "you just wrote " << message << " to the log file!\n" << std::endl; 
} 

ので、あなたはクラスを再定義しているため。あなたが既に.hからそれを組み込んだときに.cppの中で 'class Logger {'をもう一度言うことはできません。

0

コンパイラは常に、そのクラスが属するネームスペース(またはスコープ)全体で1つのクラス定義しか期待していません。現在、あなたが指定したコードでは、2つのクラス定義が存在することがわかります:1つは.hファイルに、もう1つは.cppファイルにあります。コンパイラが許可されていないクラスを再定義していると不平を言っているのはそのためです。

一般に、コンパイラエラーが発生した場合は、コンパイラが示す行を確認することをお勧めします。ほとんどの場合、問題はコンパイラーが指摘している行にあります。