Possible Duplicate:
Nullable values in C++
在 C++ 中表示可空成员的最佳方式是什么?
在 C# 中,我们可以使用 Nullable<T>
类型。非常需要这样的数据类型,因为并非所有事物都可以具有有意义的 值。它是如此重要的数据类型,@Jon Skeet花了整整一章,超过27页,仅描述Nullable<T>
在他的杰出著作中C# in Depth .
一个简单的例子可以是 Person
类1,定义为:
struct Person
{
std::string Name;
DateTime Birth;
DateTime Death;
//...
};
作为一个人总是有生日,所以Birth
上述类的成员总是有一些有意义的值。但是 Death
怎么样? ?如果这个人还活着,它的值(value)应该是多少?在 C# 中,该成员可以声明为 Nullable<DataTime>
2 可以用 null
赋值如果这个人还活着。
在 C++ 中,解决此问题的最佳方法是什么?到目前为止,我只有一个解决方案:将成员声明为 pointer:
DataTime *Death;
现在它的值可以是nullptr
当人活着的时候。但它强制使用 new
对于死人,因为它会有一些有效的值(value)。这反过来意味着不能依赖编译器生成的默认复制语义代码。程序员必须在 rule of three 之后编写复制构造函数、复制赋值、析构函数。 (C++03),或在 C++11 中,rule of five .
那么对于这个问题,我们有什么更好、更优雅的解决方案,而不是仅仅将其设为指针?
1.其他示例包括关系数据库表,因为在许多 DBMS 中,列可以为空。
2。这也有一个简写。可以写DataTime?
与 Nullable<DateTime>
完全相同 .
最佳答案
您可以查看 Boost.Optional :
struct Person
{
std::string Name;
DateTime Birth;
boost::optional<DateTime> Death;
//...
};
- 你的
Death
一开始是“未初始化的”。 - 然后您可以使用
=
为其分配一个值,例如Death = myDateTime
。 Death.is_initialized()
时,可以使用Death.get()
。- 使用
Death.reset()
再次取消初始化。
不过,对于这样的简单情况,通常认为只选择您自己的明显标记值(例如,“0000-00-00 00:00:00”的 DateTime
)会更加一致.
关于c++ - 在 C++ 中表示 Nullable 成员的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7645578/