【问题标题】:C++ class redefinition errorC++ 类重定义错误
【发布时间】:2011-06-21 14:51:07
【问题描述】:

我正在编译一个日志记录程序,但我收到了这个错误,我一辈子都想不通......

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

当我使用 gcc 编译时使用

g++ -Wall logger.cpp -o log

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;

【问题讨论】:

    标签: c++ class header redefinition redefine


    【解决方案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;
    }
    

    等等

    【讨论】:

    • 好的,我进行了更改,但现在我收到 Logger() 和 ~Logger() 的此错误............ logger.cpp:17: 错误:隐式声明的'Logger::Logger()' logger.cpp:17 的定义:错误:'Logger::Logger()' 的声明引发不同的异常 logger.h:18:错误:来自先前的声明'Logger::Logger () 抛出 ()'
    • 当然logger.cpp中的实现需要和header中的签名一致,throw ()也是需要的。另外,不要复制已经在 logger.h 文件中实现的任何函数或 ctor 主体,只在一个中实现。
    【解决方案2】:

    好吧,因为您正在重新定义课程。当您已经从 .h 中包含它时,您不能在 .cpp 中再次说 'class Logger {'。

    【讨论】:

      【解决方案3】:

      编译器总是期望类所属的整个命名空间(或范围)中只有一个类定义。目前在您指定的代码中,您会看到实际上有 2 个类定义:一个在 .h 文件中,另一个在 .cpp 文件中。这就是为什么编译器抱怨你正在重新定义一个不允许的类。

      通常,当您遇到编译器错误时,最好查看编译器告诉的行。大多数情况下,问题出在编译器指出的那一行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-17
        • 2015-11-29
        相关资源
        最近更新 更多