跨系统的静态成员初始化

卡波特

如果我有以下课程:

class Base {
protected:
    std::uint32_t generateId() {
        return TYPE_COUNTER++;
    }
private:
    static std::uint32_t TYPE_COUNTER;
}
static std::uint32_t Base::TYPE_COUNTER = 0;

然后在派生类中,我将拥有:

class Child : public Base {
public:
    static std::uint32_t getId() {
        return TYPE_ID;
    }
private:
    static const std::uint32_t TYPE_ID;
};
const std::uint32_t Child::TYPE_ID = Base::generateId();

假设代码位于客户端和服务器之间的共享静态库中,我是否可以保证子类在服务器和客户端上以及在不同平台上最终具有相同的编号?

迪特玛·库尔(DietmarKühl)

全局对象的初始化顺序仅由一个转换单元定义。如果所有全局对象都经过一次转换,则它们在所有系统上都以相同的顺序初始化,并且这些对象会得到相同的想法。

未指定翻译单元之间的初始化顺序。每次程序在同一系统上运行时,DS9k实现都可以选择以不同的顺序初始化翻译单元,或者在运行时怀疑您要向客户展示产品时,可以随机更改顺序。也就是说,即使在一个系统上,也不能保证初始化的顺序,当然也不能保证两个系统之间的初始化顺序。

似乎您正在定义线格式。希望依赖于微妙的变化,以您的源代码改变类似的ID!即使您不想公开地宣传这些ID,您当然也希望将它们固定下来:一旦您在生产中取得了一定程度的成功,这些ID就会像凿凿的石头一样固定(实际上,它更像是这样您就可以比在不中断的情况下更改生产系统来重铸石头)。请注意,我说的是理论上的考虑,但是是从实践经验上讲的!我曾在一些与您的捷径相似的捷径上工作过,这些捷径很成功,因此很难更改!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章