2017-06-28 38 views
2

我想要創建一個對象,我想保持超出範圍,但設置對其字段的引用。這種方法有什麼好處?我可以使用匿名lambdas來保存靜態值嗎?

A* a; 
B* b; 
[a, b] 
{ 
    static Loader loader("some", "argument", "the constructor", "takes"); 
    a = loader.getA(); 
    b = loader.getB(); 
}(); 

匿名lambda是否被其擁有的值破壞?是否有更好的設計模式來實現相同的目標?

好吧,這似乎是一個很好的方法。我的問題仍然是匿名lambda在解析時是否被破壞(以及它擁有的靜態變量)。

+0

[lambda函數對象中的靜態變量如何工作?](https://stackoverflow.com/questions/8391058/how-do-static-variables-in-lambda-function-objects-work) – Shiro

+0

@Shiro問題更多的是,匿名lambda是不是臨時的? –

+0

爲什麼你想保持它的範圍?有什麼問題? – Barry

回答

6

你不需要lambda來做到這一點。 static變量可以在塊範圍內聲明,所以你可以重構,以

A* a; 
B* b; 
{ 
    static Loader loader("some", "argument", "the constructor", "takes"); 
    a = loader.getA(); 
    b = loader.getB(); 
} 
// more code 

現在loader永遠不能再直接訪問(這是超出範圍),但你可以指針/引用存儲它或它的成員(這是終身持續到他的節目結束)。


此外,爲您解答有關臨時lambda表達式的壽命問題,如果你不抓住他們,他們被摧毀。

[](){ /* some code */ }(); 

將創建一個對象,調用其對象operator(),然後銷燬該臨時對象。

+0

@AdamHunyadi不知道他們是否是首選,但爲什麼創建一個對象,當你需要的只是一個新的範圍? – NathanOliver

+0

好吧,等等,這些大括號是毫無意義的,這不會使'loader'超出範圍...... –

+0

@AdamHunyadi是的。當你輸入''時,你輸入一個新的範圍。一旦你得到'//更多的代碼',以前的範圍現在已經消失了,你不能返回它。如果你在那裏聲明瞭局部變量,它們將被銷燬。 – NathanOliver

相關問題