Arn*_*rne 5 c++ inheritance stdstring c++11
对于客户端和服务器之间交换的UDP包,我想支持两种字符串字段:
cstringuint8_tsize-field的字符串vstring要自我记录我们的包的布局,我想使用简单的结构声明:
struct ABC {
vstring a;
cstring b;
}
Run Code Online (Sandbox Code Playgroud)
并调用重载函数get(char*, vstring& v)和get(char*, cstring&)内部de /序列化函数,如下所示:
void deserialize(const char* bytes, ABC& msg) {
get(msg.a);
get(msg.b);
}
void serialize(char* bytes, const ABC& msg) {
put(msg.a);
put(msg.b);
}
Run Code Online (Sandbox Code Playgroud)
但是,对于用户而言vstring,cstring理想情况下应该像正常一样std::string.
我的第一个想法是简单地进行std::string的民意基础vstring,并cstring使得两个类可以超载解析期间,disriminated而是表现为用户相同.但由于std::string劝阻,我不确定该怎么办.
派生的危险std::string在于析构函数不是虚拟的,因此有人可能会这样做:
std::string* p = new vstring;
delete p;
Run Code Online (Sandbox Code Playgroud)
你会有未定义的行为。如果您认为这样的代码没有机会在您的环境/系统中编写,请淘汰自己并从std::string.
指南:
如果vstring和cstring类仅在非常有限的受控环境中使用 - 最好是由一个或少数开发人员使用,您可以与他们沟通预期 - 并监视实际 - 使用情况,或者很明显动态分配和多态性获胜不要被滥用来处理它们,一切都很好。
在另一个极端 - 如果它们在您的接口中,与未指定数量的不受控制的代码相关,甚至无法将问题告知所有潜在的客户端开发人员 - 这是不好的,并且您不应该选择这种情况从没有虚拟析构函数的类型派生。
也就是说,您真的需要在类型中编码序列化样式吗?无论如何,他们必须编写序列化和反序列化例程,其中列出要序列化的字段,并且他们也可以在其中指定格式(NUL 终止与长度前缀或其他格式)。