C++ class redefinition error

13,144

Solution 1

It's exactly what the error message says. The implementation file can't just provide a redefinition of the class adding new member variables and conflicting function bodies wherever it pleases. Instead, provide definitions for the functions and static member variables you've already declared.

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

and so on

Solution 2

Well, because you are redefining the class. You can't say 'class Logger {' again in the .cpp when you already included it from the .h.

Share:
13,144

Related videos on Youtube

Andrew L
Author by

Andrew L

Software Engineer

Updated on June 04, 2022

Comments

  • Andrew L
    Andrew L almost 2 years

    I am compiling a logging program, but I am receiving this error and cant figure it out for the life of me...

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

    with gcc when i compile with

    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;
    
  • Andrew L
    Andrew L about 13 years
    Okay i made the changes but now i receive this error for Logger() and ~Logger().............. logger.cpp:17: error: definition of implicitly-declared ‘Logger::Logger()’ logger.cpp:17: error: declaration of ‘Logger::Logger()’ throws different exceptions logger.h:18: error: from previous declaration ‘Logger::Logger() throw ()’
  • Xeo
    Xeo about 13 years
    Of course the implementation in logger.cpp needs to have the same signature as in the header, the throw () is also needed there. Also, don't duplicate any function or ctor body you already implemented in the logger.h file, only implement it in one.