检查是否初始化了boost point_xy?

时间:2014-12-02 13:50:22

标签: c++ boost boost-geometry

我定义了一个typedef和:

typedef boost::geometry::model::d2::point_xy<double> boost2dPoint;
boost2dPoint min_p;
//.
//.(under a condition: min_p will be initialized)
//.
for(Region::Iterator itv = s.beginVer(); itv != s.endVer(); ++itv )
{
  Region::Point v_point = (*itv).pnt();
  if( (v_point(0) == min_p.x()) && (v_point(1) == min_p.y()) )
  {
     return *itv;
  }
}

我收到了警告

‘min_p’ may be used uninitialized in this function [-Wmaybe-uninitialized]

如何检查min_p是否已初始化?

3 个答案:

答案 0 :(得分:1)

你不能,至少不能单独使用那个对象。未初始化的数据没有特别标记,它只是没有指定的值。您可以将bool标记最初设置为false,并在true初始化时将其设置为min_p,但如果您要沿着这条路线行进,我建议使用boost::optional

// this is default-initialized to know that its
// data part (a boost2dpoint) is uninitialized
boost::optional<boost2dpoint> min_p; 

// initialize later
if(some_condition()) {
  min_p = boost2dpoint(foo, bar);
}

// use still later:

// Check if min_p has associated data. 
if(min_p) {
  for(Region::Iterator itv = s.beginVer(); itv != s.endVer(); ++itv )
  {
    Region::Point v_point = (*itv).pnt();

                          // +-- note: -> instead of . here. boost::optional is
                          // v                  designed to look like a pointer.        
    if( (v_point(0) == min_p->x()) && (v_point(1) == min_p->y()) )
    {
      return *itv;
    }
  }
}

我会留下the documentation的链接,这个链接不是很长。

答案 1 :(得分:0)

如果您尝试使用可能未初始化的变量,则会收到此警告。您需要为每个路径提供初始化。在声明变量时提供默认初始化,或在条件else的情况下提供值。

答案 2 :(得分:0)

这不是运行时条件。

我的静态分析(编译时)令人失望。

只需初始化您的数据。

boost2dPoint min_p {};

boost2dPoint min_p (0,0);