#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)
我认为它是因为主代码尝试调用析构函数,在循环结束后我应该更改为指针单例,但可能不会。你能告诉我如何解决这个问题吗?
答案 0 :(得分:3)
当main
退出时(如果它已被初始化),您的单身人士将被破坏。所以它的析构函数被调用了。你必须实现它(至少是空的)。否则您的程序无法链接
答案 1 :(得分:1)
如果CTimer
类的唯一成员是time_t
变量,那么您不需要(未实现,因此链接错误)析构函数,复制构造函数和赋值运算符。只需注释这三行:这些函数将由编译器生成!
答案 2 :(得分:1)
你必须为析构函数提供一个实现,因为它在main返回时被调用:
~CTimer() {}
答案 3 :(得分:1)
您正在阻止对象的破坏而不为析构函数编写正文,因此它会导致链接错误。 请写下析构函数
~CTimer()
{} //code to free any resource
答案 4 :(得分:0)
首先:你想要破坏唯一的实例吗?
如果你想要它被破坏,你必须提供一个身体
对于你的析构函数(即使它是空的),或者你必须
不要自己声明(这会公开,但那
应该不是问题)。在C ++ 11中,您还可以声明它=
default
,它告诉编译器生成它会产生什么
通常为实现生成。
然而,大多数情况下,你不需要单身人士
自毁。使用单身人士的主要原因之一是
解决初始化问题的顺序;破坏它
对破坏问题开放的大门。通常的习语
将使用一个静态指针指向单身,测试
是否在实例函数中为null,并分配
如果是新的实例。 (如果我能相信评论,那
建议这个类只在渲染过程中使用它
可能没关系,因为你不会做任何事情
一旦你调用exit
或从中返回单身人士
main
。)