C++类重定义错误
问题描述:
我编译记录程序,但我收到此错误,并不能弄明白我的生活......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;
答
这正是错误信息所说的。实现文件不能仅仅提供对类的重新定义,在任何地方添加新的成员变量和冲突的函数体。相反,请为您已经声明的函数和静态成员变量提供定义。
#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 {'。
答
编译器总是只期望类所属的整个名称空间(或范围)中只有一个类定义。目前在您指定的代码中,您会看到实际上有两个类定义:一个在.h文件中,另一个在.cpp文件中。这就是为什么编译器抱怨你正在重新定义一个不允许的类。
通常,每当遇到编译器错误时,最好查看编译器告知的行。大多数情况下,问题出在编译器指出的问题上。
好的我做了更改,但现在我收到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