2013-02-06 20 views
1

原來我有一些代碼,看起來像文件流,STL容器,和可變長度數組

class Ball 
{ 
public: 
    double x , y ; 
    ofstream out ; 
} ; 

int main() 
{ 
    Ball array[N] ; 

    array[0].out.open("./position_1.txt") ; 
    array[1].out.open("./position_2.txt") ; 

    ...... 
} 

其中N是一個運行時間來確定常數。 但它最近遭受了可變長度數組問題。

我嘗試通過使用STL容器遵循此帖子的建議Can't set variable length with variable

int main() 
{ 
    vector<Ball> Balls ; 
    Ball b ; 

    b.out.open("./position_1.txt") ; 
    Balls.push_back(b) ; 
    ...... 
} 

它在push_bak()失敗,因爲流不能被複制。

我無法確定運行前的球的數量,我必須存儲文件流而不是路徑來提高效率(防止打開和關閉文件)。

有什麼辦法可以達到目標嗎? 感謝

+0

你試圖達到什麼目標?從單個文件加載可變數量的球座標? – Spook

+0

是的,我有許多球的圖像,每個圖像有很多球。 – maythe4thbewithu

+0

我有很多圖像,每個圖像都有很多球。 每個電影的球編號是固定的,但是在第一次識別後確定。我想跟蹤他們,1,2,..並將它們保存到1.txt,2.txt,..所以我保留每個文件流,以方便訪問和效率。 現在,我在課堂外維護/新建一組流,並將「ofstream out」更改爲「ofstream * out」...類似於以下建議。感謝您的建議。 但是,如果有更像使用C++ 11的建議那樣的「自然」方式,我會更有自信。但是,我的gcc不支持C++ 11。我目前無法檢查。仍然感謝 – maythe4thbewithu

回答

3

C++流是不可拷貝,但他們是可移動的,所以你可以做到這一點,而不是:

Balls.push_back(std::move(b)); 

//DO NOT use b after push_back, as it has been moved! 

和默認的移動語義由編譯器生成的類將正常工作與此有關。

在C++ 11,你可以這樣寫:

std::vector<Ball> balls(N); //N is known at runtime 

balls[i].out.open("./position_1.txt"); //i <= i < N 

請注意,這將無法工作在C++ 03,在C++ 03載體的構造函數創建n個拷貝一個默認的創建了Ball類型的對象。但是,在C++ 11中,它不會做任何複製!

+1

或者,因爲幾乎沒有理由在'std :: stream','balls.emplace_back(「./ position_1.txt」)'上使用'open'或'close',這需要一個合理的雖然是'球'構造函數。 –

1

如果你的編譯器/庫足夠長以至於它們還不支持流的移動語義(許多不這樣做),你可能會考慮在結構中存儲一個指向流的(智能)指針。你可能希望它是一個聰明的指針 - 雖然自己正確處理所有權轉移可能是相當多的工作,才能得到正確的結果。

0

然後讓球成爲指向球的向量。用new和push_back指針分配Ball對象。

請注意,如果您使用簡單的指針,則必須使用循環刪除最後的Ball對象。您可以通過使用智能指針來避免這種情況,如std::tr1::shared_ptr