从std:string派生以添加typedef和enums

Arn*_*rne 5 c++ inheritance stdstring c++11

对于客户端和服务器之间交换的UDP包,我想支持两种字符串字段:

  • 以null结尾的c-string命名 cstring
  • 前面写有uint8_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劝阻,我不确定该怎么办.

Ton*_*roy 4

派生的危险std::string在于析构函数不是虚拟的,因此有人可能会这样做:

std::string* p = new vstring;
delete p;
Run Code Online (Sandbox Code Playgroud)

你会有未定义的行为。如果您认为这样的代码没有机会在您的环境/系统中编写,请淘汰自己并从std::string.

指南:

  • 如果vstringcstring类仅在非常有限的受控环境中使用 - 最好是由一个或少数开发人员使用,您可以与他们沟通预期 - 并监视实际 - 使用情况,或者很明显动态分配和多态性获胜不要被滥用来处理它们,一切都很好。

  • 在另一个极端 - 如果它们在您的接口中,与未指定数量的不受控制的代码相关,甚至无法将问题告知所有潜在的客户端开发人员 - 这是不好的,并且您不应该选择这种情况从没有虚拟析构函数的类型派生。


也就是说,您真的需要在类型中编码序列化样式吗?无论如何,他们必须编写序列化和反序列化例程,其中列出要序列化的字段,并且他们也可以在其中指定格式(NUL 终止与长度前缀或其他格式)。