如何在C ++ double或int变量中存储某种“null”?

时间:2014-08-28 17:49:46

标签: c++ c++11 null

我有一个看起来像这样的课程

struct A {
     double a1;
     int b1;
     double a2;
     int b2;
};

我必须读取a1b1a2b2的文件值。大多数情况下,所有四个数字都在文件中,但有时只有两个数字。

当有两个号码时,我想将值存储在a1b1中,并且我想在a2b2中存储“无”。如果a2b2是指针,我可以将它们指定为nullptr,但它们不是指针。

我可以在doubleint变量中存储一些内容,以表明“没有”存储吗?

我知道Boost.Optional可用,但我正在努力避免使用该库。

8 个答案:

答案 0 :(得分:9)

您可以将NAN分配给double a2,这也表示int b2无效。

This page用于NAN使用。

答案 1 :(得分:4)

要么你有一个不合法的价值,要么你没有。如果您的值不合法(例如-1),请将其用作哨兵。如果没有,那么没有。使用Boost.Optional或滚动自己的“value plus boolean”类。

答案 2 :(得分:4)

你做不到。我可以想到两种替代方式:

  1. 使用int *;或
  2. 使用在您的上下文中肯定无效的值。例如,如果它永远不会是负数,那么使用-1表示null。但我仍然更喜欢第一种方式,因为它的正确性不取决于要求或背景。

答案 3 :(得分:2)

看起来你将会遇到更多问题。需要知道有多少值是有效的,将通过代码库进行说明。

我建议使用 factory 基类。基本上,您将至少有两个类:

struct two_values
{
  double a1;
  int    b1;
};

struct four_values : public two_values
{
  double a2;
  int    b2;
};

当函数显式需要四个值时,请在声明中使用four_values结构。否则在函数声明中使用two_values结构。

此关系表明four_values实例可用于任何需要two_values结构的函数。

<强>替代
另一种方法是为您的商品使用std::vector

struct Container
{
  std::vector<double> a_values;
  std::vector<int>    b_values;
};

这种设计的一个好处是,矢量可以告诉你有多少项目,并且概念是可扩展的,以防你需要6个项目。

答案 4 :(得分:1)

  1. 您可以选择不在文本文件中的值(非法值),例如0-1std::numeric_limits<int>::max()。处理数据时,只有在不等于非法值(或sentinel)时才使用该值。
  2. 包含一个bool,表示有多少值:

    struct A {
        double a1;
        int b1;
        double a2;
        int b2;
        bool has_4_nums;
    };
    
  3. 根据@Peter Pei Guo使用指针(int*std::unique_ptr<int>),并在nullptr不存在时指定。{/ p>

答案 5 :(得分:0)

您有两个选项可以避免boost::optional因此依赖于Boost:

  • 使用编译器std::experimental::optional,该版本可从GCC 4.9+(以及最近版本IIRC中的Clang)和-std=c++14获得。

  • 使用AndrzejKrzemieński的“参考实施”从GitHub获取std::experimental::optional。它只是标题,所以您只需将标题复制到项目中(当然要注意许可证)

答案 6 :(得分:0)

或者,您可以添加额外的成员以了解正常成员是否受到影响,例如:

struct A {
     double a1;
     int b1;
     double a2;
     int b2;
     bool is_assigned[4];
};

struct A {
     double a1;
     int b1;
     double a2;
     int b2;
     double* p_a1; // point to a1 when initialized, else nullptr
     int* p_b1;    // point to b1 when initialized, else nullptr
     double* p_a2; // point to a2 when initialized, else nullptr
     int* p_b1;    // point to b2 when initialized, else nullptr
};

答案 7 :(得分:0)

struct A {
     double a1;
     int b1;
     double a2;
     int b2;

};

为此您可以使用任何类型的变量来指示是否为这些变量分配了两个或四个值。

喜欢将变量名称赋值= -1

因此,如果您的输入值为正,那么如果文件中有两个值,则只需输入

a2 = b2 = assigend

所以当你检查时,只需检查a2和b2的值是否为-1或其他,