所以,我找到了不同的方法来实现单身人士的“创造” 编辑:当我说“创造”时,我的意思是。当然,这段代码将放在Singleton :: {ctor}或静态Singleton :: Init()函数中。
//v1
//the first "1" is casted to a pointer to Ty, then that pointer is casted
//back to int to obtain the hex address
//the second 1 is casted to a pointer to Ty, then to a pointer
//to cSingleton<Ty> because Ty is a derived class and finally
//back to int to get the hex address
//after that it's simple pointer arithmetics to get the offset
int offset = (int)(Ty*)1 - (int)(cSingleton <Ty>*)(Ty*)1;
m_pSingleton = (Ty*)((int)this + offset);
//v2
m_pSingleton = static_cast<Ty*>(this);
//v3
m_pSingleton = (Ty*)this;
他们之间有什么显着差异吗? 据我所知,v2和v3应该是相同的,但它是v1我真的不明白。我知道它的作用,但出于何种目的?
另外,请不要将其变成“Singletons are BAAAAD”讨论。
答案 0 :(得分:2)
(由于这个问题似乎已经死了,我会尝试自己回答。)
v1
做的是手动调整this
指针以指向派生对象的地址。通常情况下,static_cast
或普通的c风格的演员本身会这样做,但可能在早期的编译器中并非如此,或者存在错误。在这种情况下,它会像演员那样做。
答案 1 :(得分:1)
v2和v3几乎相同,但v3使用的是c风格的转换(c ++样式转换更安全,因为你在编译时得到更多的检查)。
v1是......哇......这就是它正在做的事情:
1
投射到我的类型Ty
的指针,然后返回int
。我希望这仍然会产生1
。1
转换为我的类型Ty
的指针,将其转换为指针cSingleton<Ty>
,最后返回int
。我希望这仍然是1
。this
,与v2和v3类似,但调整为“offset”我猜测有一些建筑的怪癖,其中投射1的结果会导致非结果,因此偏移量将为非零。因此,这将是一种调整平台上铸造怪癖的方法。
这是一个猜测,我希望有一些评论来解释代码(但可能不会)。也许有人可以使用比我更具体的答案,但希望这会让你有所作为。
答案 2 :(得分:0)
Here是一个不错的单例C ++示例。我不知道你为什么要使用这种编码,这不是一个好习惯。