检查是否初始化了boost point_xy?

问题描述 投票:1回答:3

我定义了一个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是否初始化?

c++ boost boost-geometry
3个回答
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留下一个链接,这个链接不是很长。


0
投票

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


0
投票

这不是运行时条件。

它是静态分析(编译时)诊断。

只需初始化您的数据。

boost2dPoint min_p {};

要么

boost2dPoint min_p (0,0);
© www.soinside.com 2019 - 2024. All rights reserved.