2011-02-04 109 views
2

我編譯記錄程序,但我收到此錯誤,並不能弄明白我的生活......C++類重定義錯誤

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

與當我編譯

g++ -Wall logger.cpp -o log 
GCC

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

這正是錯誤信息所說的。實現文件不能僅僅提供對類的重新定義,在任何地方添加新的成員變量和衝突的函數體。相反,請爲您已經聲明的函數和靜態成員變量提供定義。

#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; 
} 

+0

好的我做了更改,但現在我收到Logger()和〜Logger()的錯誤.............. logger.cpp:17:error:隱式聲明的定義'Logger :: Logger()' logger.cpp:17:error:'Logger :: Logger()'的聲明引發了不同的異常 logger.h:18:error:來自前一個聲明'Logger :: Logger()throw ()' – user603756 2011-02-04 21:46:39

1

嘛,因爲你正在重新定義的類。當你已經從.h中包含它時,你不能再在.cpp中說'class Logger {'。

0

編譯器總是隻期望類所屬的整個名稱空間(或範圍)中只有一個類定義。目前在您指定的代碼中,您會看到實際上有兩個類定義:一個在.h文件中,另一個在.cpp文件中。這就是爲什麼編譯器抱怨你正在重新定義一個不允許的類。

通常,每當遇到編譯器錯誤時,最好查看編譯器告知的行。大多數情況下,問題出在編譯器指出的問題上。