2014-12-02 43 views
1

我定義一個typedef和:檢查一個boost point_xy是否被初始化?

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初始化或沒有?

回答

0

如果您嘗試使用有可能未初始化的變量,您將會收到此警告。您需要爲每個路徑提供初始化。在聲明變量時提供默認初始化,或者在條件的else大小寫中提供值。

+0

感謝您的回答,但我想知道是否有任何嵌入式功能提升空對象。 – 2014-12-02 14:02:59

0

這不是運行時狀況。

我不是靜態分析(編譯時)daignostic。

只是初始化您的數據。

boost2dPoint min_p {}; 

boost2dPoint min_p (0,0); 
+0

感謝您的回答,但對於第二個建議:什麼是v_point(0,0);那麼,而不是無限的,它會返回錯誤的結果。 – 2014-12-02 13:59:28

+0

也應該初始化爲boost2dPoint min_p {};否則:錯誤:在C++ 98中'min_p'必須由構造函數初始化,而不是由'{...}' – 2014-12-02 14:01:43

+0

這是什麼nullentity,你似乎在談論?請注意,'min_p = {}'將在C++ 98(聚合初始化)中工作。我強烈地認爲,默認的point_xy實現是非常多的POD。不會有「無限」。 – sehe 2014-12-02 14:18:34

1

你不能,至少不是單靠對象。未初始化的數據未被特別標記,它只是沒有指定的值。你可能具有的選擇最初設置爲false並將其設置爲truemin_p初始化一個bool標誌,但如果你要這條路線,我建議使用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

謝謝,儘管我使用if(min_p.is_initialized()){...};我仍然收到'*((void *)&min_p +8)'可能在此函數中未初始化使用[-Wmaybe-uninitialized] – 2014-12-05 10:06:56

+0

警告是虛假的。不過,你明白這一點很奇怪;這個警告已經在很久以前固定了。你使用的是舊版本的gcc或boost嗎? – Wintermute 2014-12-05 10:14:33

+0

提升1.56,海灣合作委員會4.7.2 – 2014-12-05 10:48:49

相關問題