1

次のクラス Base と Derived があり、コンパイラをコンパイルすると、抽象的であるため DLog のインスタンスを作成できないと不平を言います。

このエラーを修正する方法を教えてもらえますか?

純粋仮想関数の両方が Derived に実装されていないわけではないためだと思います。

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 インスタンス

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

2 に答える 2

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

クラス DLog には実装されていません。基本クラスでは純粋仮想であるため、実装する必要があります。

loginの最初のオーバーロードで、おそらくこれを意味していましたDLog

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

編集:また、のオーバーロードを実装していません

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

ただし、 を使用することconst_castは非常に悪い考えであり、未定義の動作であることに注意してください。代わりに次のようなことを行うことで、明確に定義された動作を取得できます。

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 にすることです。

于 2010-07-06T12:01:29.920 に答える
1

DLogクラスを派生させることにより、基本クラスで宣言されたすべての純粋仮想メソッド (抽象クラスとして使用しLoggerたくない場合) の実装を提供することが保証されます。DLogここでは、純粋仮想関数に実装を提供していないため、クラスDLogは抽象クラスになります。C++ では、抽象クラスのインスタンスを作成できないため、コンパイラ エラーが発生します。ところで、基本クラスには仮想デストラクタがありません。

于 2010-07-06T12:04:52.917 に答える