跨系统的静态成员初始化

时间:2014-01-01 01:13:15

标签: c++ static cross-platform

如果我有以下课程:

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();

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

3 个答案:

答案 0 :(得分:2)

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

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

看来你正在定义一种线格式。您希望依赖对源代码的细微更改来更改ID之类的内容!即使你不想公开宣传这些ID,你当然也想要把它们搞定:一旦你在生产中有一个稍微成功的代码片段,这些ID就像凿石一样固定(实际上,它更像是你可以设法改造石头,而不是在不中断的情况下改变生产系统。请注意,我是从理论上考虑,而是从实践经验谈起!我曾经研究过类似于你的快捷方式的系统,这些系统很成功,因此很难改变!

答案 1 :(得分:0)

如果客户端和服务器位于不同的进程中,则不会。对于每个进程,分配给子实例的Id序列将是顺序的。如果所有客户端碰巧与服务器具有完全相同数量的子实例,那么它们将具有相同的ID集合。

答案 2 :(得分:0)

如果我理解正确,您希望将数据从服务器传输到客户端,并为每个数据批添加唯一ID,以指示如何对其进行反序列化。

(您可能还希望将客户端传输到服务器,甚至将客户端传输到客户端)。

这听起来有点像HTTP mime类型。事实上,你可以使用mime类型吗?

另一种可能性是创建一个文件(可能是XML ??),其中包含ID列表和解码它们的方法。该文件可以与每个客户端或服务器一起安装,或者服务器可以根据请求将其传输给每个客户端 - 可能随着时间的推移传输更新版本。

如果有一些共享磁盘空间,您可以在所有客户端之间共享一个(只读)文件 - 但这可能不太实际,具体取决于您的网络架构。

如果上述方法无效,或许您可以更详细地描述您的要求?