2013-10-03 84 views
0

我不知道我該怎麼說這個,所以我會嘗試把它放在代碼中。 (這有許多錯誤,我知道這不會編譯它僅僅是爲了證明什麼,我想要做的,因爲我不能把它的話)寫一個類的向量到一個文件的方法

using namespace std; //for correctness sake 
    class foo { 
    public: 
     foo(int a=0, int n=0); 
     void stuff(int a); 
     void function(int n); 
     const int get_function() {return n;} 
     const int get_stuff(){return a;} 
    private: 
     int n, a; 
    }; 
    struct Store{ 
     public: get_foo(){return vector<f.foo>;} //I'm not too sure of the syntax here but you get the idea 
    private: 
     foo f; 

    } 

基本上我想採取在返回的所有信息類foo,並將其格式化後輸出到文件中。事情是,我需要在文件中製作其中的許多內容,並且必須能夠讀取它,因爲它是值得的。 所以只需將每個連續的foo類添加到文件中將不起作用(至少我不明白)。

我試圖使用ostream來重載<<運算符,但我不知道如何調用它來將其寫入文件。歡迎任何建議!謝謝。

+0

注:'常量get_function(){返回N;}'是不是符合標準C++。該語言需要所有聲明的類型說明符。這個(以及'get_stuff()')應該用'int'聲明。自己決定是否認爲'const'是有保證的(不是)。 – WhozCraig

+0

@WhozCraig你是對的我忘了函數類型,我使用了const,因爲這是我在課堂上看到的例子。 – Shilaly

+0

我高度懷疑聲明應該是'int get_function()const {return n; },因爲成員沒有修改對象的要求。 – WhozCraig

回答

2

我覺得你Store應該是這樣的:

struct Store 
{ 
public: 
    std::vector<foo> get_foo() 
    { 
     return f; 
    } 

private: 
    std::vector<foo> f; 
}; 

超載std::ostream<<

std::ostream& operator<<(std::ostream& out, const Store& f) 
{ 
    for (auto &x : f.get_foo()) 
    out << x.get_function() << ", " << x.get_stuff() << "\n"; 

    return out; 
} 

//Without auto 

std::ostream& operator<<(std::ostream& out, const Store& f) 
{ 
    std::vector<foo> q = f; 
    for (int i=0; i<q.size(); i++) 
    out << q[i].get_function() << ", " << q[i].get_stuff() << "\n"; 

    return out; 
} 
+0

感謝您的回覆,您能否向我解釋x?我很困惑它爲什麼是x.get_function而不是foo類。 對不起,我不熟悉'auto'和幾個C++ 11特性在這些情況下如何工作。 – Shilaly

+0

@M M. Ahh謝謝,我想我現在看看它在做什麼。它基本上是壓縮迭代(可能比實際更簡單)。在這種情況下使用auto有什麼好處,而不是增加i來移動vector? – Shilaly

+0

@Shilaly:它語法糖。使代碼更小,更清晰,更一般。 – deepmax

0

我想你需要的東西是這樣的:

template<typename T> 
std::ostream& operator << (std::ostream& out, const std::vector<T*>& elements) 
{ 
    for (size_t i = 0; i < elements.size(); i++) 
    out << elements[i] << ", "; 
    return out << std::endl; 
} 
+0

謝謝,我還沒有使用模板,所以我會研究模板並嘗試您的建議。您是否特別推薦任何參考資料,或者Google搜索是否足夠? – Shilaly

1

有許多吊環你的代碼錯誤。

很多,很明顯,你從來沒有讀過任何C++書,只是試驗一個編譯器。

不要這樣做。由於許多獨立的原因,C++實際上是世界上最糟糕的語言。

不管你多聰明。

其實很聰明在某些領域存在問題,因爲許多C++規則不是一致的邏輯設計的結果,而是歷史演變和委員會決策的結果。甚至連哈里謝爾頓都無法正確預見一個委員會的決定,你無法推斷歷史。

只需選擇一個good book並閱讀封面封面。沒有其他明智的方法來學習C++。

關於將結構寫入文件中,該主題通常稱爲「序列化」,並負責將活動對象轉換爲無用字節序列(寫入文件或通過網絡發送)以及將字節序列轉換回實時對象(在同一系統上,在另一個相同系統上,甚至在不同系統上)的逆問題「反序列化」。

這個問題有很多方面,例如,如果你關心的是系統之間的可移植性,速度,字節序列的大小,重載字節序列的能力,當你的類稍有不同時,程序(版本控制)。

你可以做的最簡單的事情就是文件上的fwrite事情,但這在C++中通常只是無稽之談,而且即使在技術上可能的情況下,由於許多原因也是一種可怕的方式。例如,您不能直接fwritestd::vector對象,並希望將其讀回。

+0

是的,代碼不會編譯我知道,這不是我想編譯的東西,如果我可以用文字說出來的話,我不會編寫任何代碼。在我的問題中代碼的重點不是完美的,而是想象我正在試圖用我的課程做什麼。我想用C++來做這件事,因爲我試圖學習C++。 – Shilaly

+0

1000%同意上述說。 @Shilaly - 即使你覺得閱讀一本書很無聊,你可以在互聯網上找到很多樣本。其中一些甚至會編譯。 – SChepurin

+0

@Schepurin那麼這不是我的第一個度假勝地相信與否。我做了很多搜索「將結構向量寫入文件中」,並且找不到任何可接近的地方。如果你能指出我明顯錯過的一些,我將不勝感激。另外,一個附註,你在Stroustrup書中找到的很多代碼都不能編譯。我完全理解我想做什麼的想法,語法讓我困惑。 – Shilaly

相關問題