C++ 检查增压点_xy是否已初始化?
我定义了一个typedef,并且:C++ 检查增压点_xy是否已初始化?,c++,boost,boost-geometry,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::P
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是否已初始化???如果您试图使用可能未初始化的变量,则会收到此警告。您需要为每个路径提供初始化。声明变量时提供默认初始化,或者在条件的
else
中提供值。这不是运行时条件
我是静态分析(编译时间)的daignostic
只需初始化数据
boost2dPoint min_p {};
或
你不能,至少不能单独使用这个对象。未初始化的数据没有特别标记,只是没有指定的值。您可以有一个
bool
标志,该标志最初设置为false
,并在min\u p
初始化时将其设置为true
,但如果您要这样做,我建议使用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;
}
}
}
//这是默认初始化,以知道其
//数据部分(boost2dpoint)未初始化
boost::可选最小值;
//稍后初始化
if(某些条件()){
min_p=boost2dpoint(foo,bar);
}
//请稍后使用:
//检查min_p是否有相关数据。
如果(最小值){
对于(Region::Iterator itv=s.beginVer();itv!=s.endVer();++itv)
{
区域::点v_点=(*itv).pnt();
//+--注意:->而不是.here.boost::可选
//v设计成一个指针。
如果((v_点(0)=min_p->x())&&(v_点(1)=min_p->y())
{
返回*独立电视台;
}
}
}
我会留下一个到的链接,它不是很长。谢谢你的回答,但是第二个建议是:有一个v_点(0,0);然后,它将返回错误的结果,而不是nullentity;否则:错误:在C++98中,“min_p”必须由构造函数初始化,而不是由“{…}”初始化。这是什么nullentity,您似乎在谈论什么?请注意,
minu p={}
将在c++98(聚合初始化)中工作。我强烈地假设默认的point_xy实现在很大程度上是一个POD。没有“nullentity”。谢谢你的回答,但我想知道boost中是否有任何针对null对象的嵌入函数。谢谢,尽管我使用if(min_p.is_initialized()){…};我仍然收到此函数中可能未初始化使用的“((void)&min_p+8)”[-Wmaybe uninitialized]警告是虚假的。但奇怪的是,你得到了它;此警告已在多年前修复。您使用的是非常旧版本的gcc还是boost?boost 1.56、gcc 4.7.2Strange。我只是用GCC4.7.4和Boost1.55(使用-Wall-Wextra-pedantic,显式使用-Wmaybe uninitialized)进行了尝试,没有收到任何警告。您确定没有在选中块之外的某个位置使用*min\u p
?
boost2dPoint min_p (0,0);
// 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;
}
}
}