Ошибка переопределения класса C ++ - PullRequest
2 голосов
/ 04 февраля 2011

Я компилирую программу регистрации, но я получаю эту ошибку и не могу понять это на всю жизнь ...

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;

Ответы [ 3 ]

5 голосов
/ 04 февраля 2011

Это именно то, что говорится в сообщении об ошибке.Файл реализации не может просто обеспечить переопределение класса, добавляя новые переменные-члены и конфликтующие тела функций, где это угодно.Вместо этого предоставьте определения для функций и статических переменных-членов, которые вы уже объявили.

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

и т. Д.

1 голос
/ 04 февраля 2011

Ну, потому что вы переопределяете класс. Вы не можете снова сказать «class Logger {» в .cpp, если вы уже включили его из .h.

0 голосов
/ 05 февраля 2011

Компилятор всегда ожидает только одно определение класса во всем пространстве имен (или области видимости), к которому принадлежит этот класс. В настоящее время в указанном вами коде вы увидите, что существуют определения классов infact 2: одно в файле .h, а другое в файле .cpp. Вот почему компилятор жалуется, что вы переопределяете класс, который не разрешен.

Обычно, когда вы сталкиваетесь с ошибкой компилятора, рекомендуется взглянуть на строки, которые сообщает компилятор. В большинстве случаев проблема заключается в том, что указывает компилятор.

...