2010-08-13 55 views
1

我將一些C++代碼從Unix移植到Linux(Red Hat)。從Unix到Linux移植ostream :: opfx/osfx

我遇到了以下模式:

ostream& myfunction(ostream& os) 
{ 
    if (os.opfx()) 
    { 
    os << mydata; 
    os.osfx(); 
    } 
    return os; 
} 

功能opfxosfx不可用紅帽4.5。我看到一個建議here使用ostream::sentry功能:

ostream& myfunction_ported(ostream& os) 
{ 
    ostream::sentry ok(os); 
    if (ok) 
    { 
    os << mydata; 
    } 
    return os; 
} 

我從here看到的opfx目的是沖洗,並繼續之前驗證流的狀態。

我的問題:

我以爲ostream功能已經檢查過流狀態的流進行操作之前。這是真的?這在某些時候是不是真的?

是否需要替換opfxsentrysentry給我說operator<<不是已經給我了嗎?

回答

1

任何現有的插件(除非它真的是可怕的越野車)已經在創建一個哨兵對象,所以只要您通過現有的插件來完成您的工作,您就不需要自己創建一個哨兵對象。

需要創造,當你直接寫你的數據在自己的流緩衝區哨兵對象,沒有任何現有插件的幫助(例如,當你不使用其他任何將創建一個哨兵給你)。

對於這段代碼,你可以完全消除創建哨兵對象,並做一些事情,如:

ostream& myfunction(ostream& os) 
{ 
    return os << mydata; 
} 

注意的是,現有的代碼被宣佈爲返回ostream &,但似乎並沒有真正返回任何東西。

+0

謝謝你的建議。我在輸入兩個樣品時錯過了退貨聲明,並修復了它。 – Bill 2010-08-13 18:51:30