2010-03-02 78 views

回答

10

std::stack(像所有的STL容器)要求其包含的類型是 「分配」。在STL中,這意味着它必須有一個拷貝構造函數和一個operator=std::ifstream既沒有這些。

你可以想象爲什麼你不希望能夠複製和分配I/O流;當存在兩個相同流的副本時應該發生的語義並不明顯。是否應該讀取或寫入一個副本影響另一個副本的位置?關閉一個流關閉另一個?等等。

如果你想擁有「一個容器std::ifstream s」,那麼你真正應該做的是「一個容器std::ifstream* s」。非常量指針總是可賦值的。需要注意的是,在這種情況下,你必須確保在破壞容器之前刪除指針,因爲容器不會爲你做。

+0

但是,你可以有一堆ifstream指針:std :: stacked s; – ALOToverflow 2010-03-02 13:55:17

+0

傑出!謝謝。 - Prasoon – 2010-03-02 14:24:30

0

在這裏備份泰勒(投票+1後)。

stl容器將複製到您給它們的對象的所有位置。如果你願意,你可以通過給他們特殊的對象與精心製作的拷貝構造函數和具有引用計數和什麼的破壞結構來處理這個問題。

一般來說,我覺得這太麻煩了。按照經驗法則,只能在容器中使用小對象。如果您想製作一堆結構或類別,請使用指針代替它們。

+0

作爲我的經驗法則:1)只編寫實現複製的成員類(例如'std :: string',而不是'char *'),否則存儲智能指針(並使確保該課程不可複製)。 – UncleBens 2010-03-02 14:03:09

+0

即使你做了#1,在我的(通常是實時的)工作中,複製周圍的大型對象或任何可能涉及動態分配/釋放的東西都是不好的。 – 2010-03-02 14:51:57

+0

在這種情況下,你可能使用特殊的內存池等(因爲你不能動態分配指針),這使得C++的具體使用。你真的認爲這是一個好的建議,爲初學者避免'矢量'贊成''?國際海事組織的開銷通常並不重要,除非在特定的情況下。 – UncleBens 2010-03-02 16:21:08

2

由於流不可複製,因此您可以將它們放入標準容器中。

但是我們可以通過存儲指向流的指針來解決這個問題。但是你不想在標準容器中存儲指向流的指針(特別是如果它們是動態分配的話)。所以我們希望提升解決方案。

Boost有指針容器的概念。
這允許您動態分配一個對象並將指針存儲在指針容器中,該指針容器接受對象的所有權,並讓您像訪問對象(而不是指針)一樣訪問動態對象。

因爲指針容器擁有所有權,所以您不必擔心刪除對象。容器會這樣做。

因爲它允許訪問包含的對象作爲對象而不是指針,它允許您在標準算法中以更自然的方式使用流(使用指針容器運行)。

相關問題