2010-07-06 4 views
1

다음 클래스가 기본 및 파생 클래스이고 컴파일러가 추상 클래스이므로 DLog 인스턴스를 만들 수 없다는 불만이 있습니다.순수 가상 함수 및 추상 클래스

누군가이 오류를 해결할 수있는 방법을 알려 줄 수 있습니까?

순수 가상 함수가 파생되지 않았기 때문에 추측하고 있습니다. 싱글

DLog *DLog::Instance() 
{ 
    if (!m_instance) 
     m_instance = new DLog(); 
    return m_instance; 
} 
+2

분명히 파생 클래스에서 PVF를 구현해야합니다. –

+1

제발 제발, 줄임표와 함께 기능을 오버로드하지 마십시오. 밤에 머리카락을 잡아 당기거나 늦은 밤에 디버깅하는 시간을 절약 해줍니다. –

+0

@Alex : 과부하가 아닌 ... 대문자 L 로그 기능. 다른 것들은 소문자입니다 ... –

답변

2
virtual void log(string logText, int debugLevel, string threadName = "") = 0; 

class Logger 
{ 
public: 

    virtual void log(int debugLevel, char* fmt, ...) = 0; 
    virtual void log(string logText, int debugLevel, string threadName = "") = 0; 

    static Logger* defaultLogger() {return m_defaultLogger;} 
    static void setDefaultLogger(Logger& logger) {m_defaultLogger = &logger;} 

protected: 

    static Logger* m_defaultLogger; 
}; 

class DLog : public Logger 
{ 
public: 
    DLog(); 
    ~DLog(); 

    static DLog *Instance(); 
    static void Destroy(); 

    void SetLogFilename(std::string filename); 
    void SetOutputDebug(bool enable); 
    std::string getKeyTypeName(long lKeyType); 
    std::string getScopeTypeName(long lScopeType); 
    std::string getMethodName(long lMethod); 

    virtual void log(string logText, int debugLevel) 
    { 
     Log(const_cast<char*>(logText.c_str())); 
    } 

    void Log(char* fmt, ...); 

private: 

    static DLog *m_instance; 

    std::string m_filename; 
    bool m_bOutputDebug; 
}; 

// DLOG의 instantion 클래스 DLOG에서 구현되지 않았습니다. 그것은 기본 클래스에서 순수 가상이기 때문에 구현해야합니다.

당신은 아마 DLoglog의 첫 번째 과부하이 의미 :

virtual void log(string logText, int debugLevel, string /*threadname*/) 
{ 
    Log(const_cast<char*>(logText.c_str())); 
} 

편집 : 그 사용 const_cast는 비록 당신은 여기

virtual void log(int debugLevel, char* fmt, ...) = 0; 

주의 과부하를 구현하지 않은 아주 나쁜 생각이고 정의되지 않은 행동입니다. 다음과 같이하면됩니다 :

virtual void log(string logText, int debugLevel, string /*threadname*/) 
{ 
    logText.push_back('\0'); // Add null terminator 
    Log(&logText[0]); // Send non-const string to function 
    logText.pop_back(); // Remove null terminator 
} 

"Log"를 처음에는 const-correct로 만듭니다. 당신은 당신이 기본 클래스에 선언 된 순수 가상 메소드를 (당신이 추상 클래스로 DLog을 원하지 않는 가정) 모든 구현을 제공 할 것으로 확신하고 있습니다 Logger에서 DLog 클래스를 파생하여

+0

문자열이 null로 끝났다고 생각 했습니까 ?? 아니면 그냥 char * thats null이 종료 되었습니까? –

+1

@ 토니 : 일부'std :: string' 구현체는 null 터미네이터를 가지지 만,'c_str' 멤버를 호출하지 않는 한 그것들은 필요하지 않습니다. 그러나'c_str'에 의해 반환 된 버퍼를 수정할 수없고 잘 정의 된 동작을 할 수 없습니다. –

1

. 여기서는 순수 가상 함수에 구현을 제공하지 않으므로 클래스 DLog이 추상 클래스가됩니다. C++에서는 추상 클래스의 인스턴스를 만들 수 없으므로 컴파일러 오류가 발생합니다. BTW, 기본 클래스 가상 소멸자가 없습니다.