C++;:建议用什么方法区分从未设置过值的字符串和空字符串? 我们有一个java消息API,我们正在翻译成C++。消息通常具有简单的数据类型,如字符串、int、double等。构造消息时,我们将所有成员变量初始化为默认值,API将其识别为“null”值(即从不设置为任何值),例如int类型的Integer.MAX_值。任何被视为空的字段都不会序列化和发送

C++;:建议用什么方法区分从未设置过值的字符串和空字符串? 我们有一个java消息API,我们正在翻译成C++。消息通常具有简单的数据类型,如字符串、int、double等。构造消息时,我们将所有成员变量初始化为默认值,API将其识别为“null”值(即从不设置为任何值),例如int类型的Integer.MAX_值。任何被视为空的字段都不会序列化和发送,c++,string,C++,String,在Java中,字符串自动初始化为null,因此很容易区分为null的字符串字段和为空字符串的字符串(消息中要发送的合法值) 我不知道C++中处理这个问题的最好方法,因为字符串自动初始化为空字符串,空字符串是通过API发送的合法值。我们可以将字符串默认为一些控制字符(这在我们的API中不是一个合法的值),但我想知道是否有更传统或更好的方法来做到这一点 我们在C++中都是新的,所以我们可能忽略了一些明显的方法。 < P>推荐的方法是使对象在它有一个有效值之前不存在。如果带有空字符串的消息无效,为什么

在Java中,字符串自动初始化为
null
,因此很容易区分为null的字符串字段和为空字符串的字符串(消息中要发送的合法值)

<>我不知道C++中处理这个问题的最好方法,因为字符串自动初始化为空字符串,空字符串是通过API发送的合法值。我们可以将字符串默认为一些控制字符(这在我们的API中不是一个合法的值),但我想知道是否有更传统或更好的方法来做到这一点

我们在C++中都是新的,所以我们可能忽略了一些明显的方法。

< P>推荐的方法是使对象在它有一个有效值之前不存在。如果带有空字符串的消息无效,为什么允许它

在Java中无法避免它,因为字符串总是可以为null。 但是C++提供了创建一个类的工具,它保证了字符串的始终。 听起来这就是你想要的

对于您所要求的,最好的方法实际上是在类中构建不变量,即该类的对象始终具有字符串集。与其将所有对象设置为构造函数中的某个默认值,不如定义构造函数以获取实际参数并将成员设置为有效值

但是,如果要指定一个“可选”值,有两种广泛的方法:

  • 或者使用指针(最好是智能指针)。指向字符串的指针可以为空,也可以指向有效字符串(也可以是空的,也可以不是空的)
  • 或者,从boost库中使用类似于
    boost::optional的内容。这是一个聪明的小实用程序模板,它允许您定义可选值(对象可能包含字符串,也可能为空)
  • 或者您可以简单地添加一个
    bool
    标志(类似于
    has_string
    ,如果未设置,则表示未设置任何字符串,并且应忽略字符串值)
就我个人而言,我更喜欢最后两种方法,但这三种方法都非常常用,而且效果很好。但是最好的方法是设计类,这样编译器就可以保证它总是有效的。如果不希望消息具有空字符串,请让编译器确保消息永远不会具有空字符串。

建议的方法是使对象在具有有效值之前不存在。如果带有空字符串的消息无效,为什么允许它

在Java中无法避免它,因为字符串总是可以为null。 但是C++提供了创建一个类的工具,它保证了字符串的始终。 听起来这就是你想要的

对于您所要求的,最好的方法实际上是在类中构建不变量,即该类的对象始终具有字符串集。与其将所有对象设置为构造函数中的某个默认值,不如定义构造函数以获取实际参数并将成员设置为有效值

但是,如果要指定一个“可选”值,有两种广泛的方法:

  • 或者使用指针(最好是智能指针)。指向字符串的指针可以为空,也可以指向有效字符串(也可以是空的,也可以不是空的)
  • 或者,从boost库中使用类似于
    boost::optional的内容。这是一个聪明的小实用程序模板,它允许您定义可选值(对象可能包含字符串,也可能为空)
  • 或者您可以简单地添加一个
    bool
    标志(类似于
    has_string
    ,如果未设置,则表示未设置任何字符串,并且应忽略字符串值)
就我个人而言,我更喜欢最后两种方法,但这三种方法都非常常用,而且效果很好。但是最好的方法是设计类,这样编译器就可以保证它总是有效的。如果您不希望消息具有空字符串,请让编译器确保消息永远不会具有空字符串。

要复制Java“东西可以有值,也可以没有值”,最常用的方法可能是存储
boost::optional
,或在下一版本的标准中存储
std::optional

如果你想读取它们的值,你必须加入一些
*
->
,并且要小心
可选的
,因为它到
bool
的默认转换是“我是否初始化了?”,而不是存储的
bool
。但是
operator=
在写入它时做了您希望它做的事情,它只是从中读取,可以在
bool
上下文中做意外的事情

要判断
可选
是否已初始化,只需在
bool
上下文中对其进行评估,就像您可能使用指针一样。要在确认其已初始化后提取其值,请使用一元
*
运算符

<代码> Boost 是一个相对高质量的库,代码在5到10年内从它移植到C++标准的速率很高。它确实包含了一些可怕的部分(如凤凰!),并且通常你应该确保你使用的任何组件都不在C++标准库中(迁移到那里)。代码>增强::可选

i