相关疑难解决方法(0)

在C++中表示Nullable成员的最佳方法?

可能重复:
C++中的Nullable值

在C++中表示可空成员的最佳方法是什么?

在C#中,我们可以使用Nullable<T>类型.非常需要这样的数据类型,因为并非所有数据都具有有意义的价值.这是一个非常重要的数据类型,@ Jon Skeet花了整整一章,跨越了27页,仅Nullable<T>在他的优秀着作C#Depth中进行了描述.

一个简单的例子可以是一个Person1,定义为:

struct Person
{
  std::string Name;
  DateTime    Birth;
  DateTime    Death;
  //...
};
Run Code Online (Sandbox Code Playgroud)

由于一个人总是有生日,所以Birth上述班级的成员总会有一些有意义的价值.但是怎么样Death?如果这个人还活着,它应该有什么价值呢?在C#中,此成员可以声明为Nullable<DataTime>2,null如果此人活着,则可以将其分配.

在C++中,解决这个问题的最佳方法是什么?截至目前,我只考虑了一个解决方案:将成员声明为指针:

 DataTime *Death;
Run Code Online (Sandbox Code Playgroud)

现在它的价值可以是nullptr人活着的时候.但它强迫使用new死人,因为它会有一些有效的价值.它反过来意味着不能依赖编译器生成的默认复制语义代码.程序员必须编写复制构造函数,复制赋值,析构函数遵循三条规则(C++ 03),或者在C++ 11中规则,五条规则.

那么,除了制作指针之外,我们还有更好,更优雅的解决方案吗?


其他示例包括关系数据库表,因为在许多DBMS中,列可以为空.

这也有一个简写.人们可以写DataTime?正是因为相同Nullable<DateTime>.

c++ nullable c++11

32
推荐指数
3
解决办法
2万
查看次数

C++中的可空值

我正在使用本机C++创建数据库访问层,我正在寻找支持NULL值的方法.这是我到目前为止:

class CNullValue
{
public:
    static CNullValue Null()
    {
        static CNullValue nv;

        return nv;
    }
};

template<class T>
class CNullableT
{
public:
    CNullableT(CNullValue &v) : m_Value(T()), m_IsNull(true)
    {
    }

    CNullableT(T value) : m_Value(value), m_IsNull(false)
    {
    }

    bool IsNull()
    {
        return m_IsNull;
    }

    T GetValue()
    {
        return m_Value;
    }

private:
    T m_Value;
    bool m_IsNull;
};
Run Code Online (Sandbox Code Playgroud)

这就是我必须定义函数的方法:

void StoredProc(int i, CNullableT<int> j)
{
    ...connect to database
    ...if j.IsNull pass null to database etc
}
Run Code Online (Sandbox Code Playgroud)

我称之为:

sp.StoredProc(1, 2);
Run Code Online (Sandbox Code Playgroud)

要么

sp.StoredProc(3, CNullValue::Null());
Run Code Online (Sandbox Code Playgroud)

我只是想知道是否有比这更好的方法.特别是我不喜欢CNullValue的单例类对象和静态.我更愿意这样做

sp.StoredProc(3, …
Run Code Online (Sandbox Code Playgroud)

c++ nullable data-access-layer

30
推荐指数
3
解决办法
1万
查看次数

标签 统计

c++ ×2

nullable ×2

c++11 ×1

data-access-layer ×1