0
#pragma once
#include <time.h>        

class CTimer
{
    time_t _last;
    CTimer() { _last = time( NULL ); }
    CTimer(const CTimer &);
    CTimer& operator=(const CTimer&);
    ~CTimer();
public:
    static CTimer& getInstance(){        
        static CTimer instance;
        return instance;
    }

    float getDelta(){
        time_t now = time( NULL );
        float delta = (float)(now - _last);     
        return delta;
    }
    //should be called at the beginning of rendering function
    void update(){
        _last = time( NULL );
    }
};

これは私の Timer シングルトン コードです。私はそれをそのように使いたかった: プレイヤークラスのどこか:

posX += vel * CTimer::getInstance().getDelta();

メインループファイルでは:

void gameLoop(){
CTimer::getInstance().update();
...
}

しかし、私はこのエラーが発生します:

1>Main.obj: エラー LNK2019: 未解決の外部シンボル "private: __thiscall CTimer::~CTimer(void)" (??1CTimer@@AAE@XZ) 関数 "void _ cdecl public: static class getInstance & __cdecl CTimer::getInstance(void)'::2'::` 動的 atexit デストラクタで参照「インスタンス」(無効) の場合" (?? _Finstance@?1??getInstance@CTimer@@SAAAV1@XZ@YAXXZ)

ループが終了した後、メインコードがデストラクタを呼び出そうとするためだと思いますが、ポインタシングルトンに変更する必要がありますが、そうではないかもしれません。これを修正する方法を教えていただけますか?

4

5 に答える 5

1

If the only member of your CTimer class is the time_t variable, then you don't need the (not implemented, hence the linking error) destructor, the copy constructor and the assignment operator. Just comment those three lines: these functions will be generated by the compiler !

于 2013-05-21T11:38:20.200 に答える
1

デストラクタのボディを記述せずにオブジェクトの破壊をブロックしているため、リンクエラーが発生しています。デストラクタの本体を記述してください

~CTimer()
    {} //code to free any resource

コード例: http://ideone.com/TqtLVX#view_edit_box

于 2013-05-21T11:54:26.463 に答える
0

最初: 一意のインスタンスを破棄しますか? 破棄したい場合は、デストラクタの本体をどこかに提供するか (空の場合でも)、自分で宣言しないようにする必要があります (これにより公開されますが、問題にはなりません)。C++11 では、 it を宣言することもできます= default。これにより、通常は実装用に生成されるものを生成するようコンパイラに指示されます。

ただし、ほとんどの場合、シングルトンが破棄されることは望ましくありません。シングルトンを使用する主な理由の 1 つは、初期化の問題の順序を解決することです。それを破壊すると、破壊の問題の秩序への扉が開かれたままになります。通常のイディオムは、シングルトンへの静的ポインターを使用し、インスタンス関数で null かどうかをテストし、null の場合は新しいインスタンスを割り当てることです。(このクラスはレンダリング中にのみ使用されることを示唆するコメントを信じることができれば、シングルトンを呼び出しexitたり、 main.

于 2013-05-21T12:51:03.667 に答える