Singleton析构函数称为错误

时间:2013-05-21 11:30:28

标签: c++ pointers reference

#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&gt; Main.obj:错误LNK2019:未解析的外部符号&#34;私有:__ thiscall CTimer :: ~CTimer(void)&#34; (?? 1CTimer @@ AAE @XZ)在函数&#34; void _ cdecl public: static class getInstance & __cdecl CTimer::getInstance(void)':: 2&#39; ::`动态atexit析构函数中引用&#39;&#39;&#39; ;(无效)&#34; (?? _Finstance @,α1≠的getInstance @ @@ CTIMER @ SAAAV1 XZ @ YAXXZ)

我认为它是因为主代码尝试调用析构函数,在循环结束后我应该更改为指针单例,但可能不会。你能告诉我如何解决这个问题吗?

5 个答案:

答案 0 :(得分:3)

main退出时(如果它已被初始化),您的单身人士将被破坏。所以它的析构函数被调用了。你必须实现它(至少是空的)。否则您的程序无法链接

答案 1 :(得分:1)

如果CTimer类的唯一成员是time_t变量,那么您不需要(未实现,因此链接错误)析构函数,复制构造函数和赋值运算符。只需注释这三行:这些函数将由编译器生成!

答案 2 :(得分:1)

你必须为析构函数提供一个实现,因为它在main返回时被调用:

~CTimer() {}

答案 3 :(得分:1)

您正在阻止对象的破坏而不为析构函数编写正文,因此它会导致链接错误。 请写下析构函数

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

示例代码: http://ideone.com/TqtLVX#view_edit_box

答案 4 :(得分:0)

首先:你想要破坏唯一的实例吗? 如果你想要它被破坏,你必须提供一个身体 对于你的析构函数(即使它是空的),或者你必须 不要自己声明(这会公开,但那 应该不是问题)。在C ++ 11中,您还可以声明它= default,它告诉编译器生成它会产生什么 通常为实现生成。

然而,大多数情况下,你不需要单身人士 自毁。使用单身人士的主要原因之一是 解决初始化问题的顺序;破坏它 对破坏问题开放的大门。通常的习语 将使用一个静态指针指向单身,测试 是否在实例函数中为null,并分配 如果是新的实例。 (如果我能相信评论,那 建议这个类只在渲染过程中使用它 可能没关系,因为你不会做任何事情 一旦你调用exit或从中返回单身人士 main。)