2012-10-07 33 views
1

我想我的序列化類的一些私有屬性:fstream的怪異的行爲

class Task { 
    public: 
     enum Status { COMPLETED, PENDIENT }; 
     // BLAH BLAH BLAH 
     // CLASS GETTERS SETTERS ETC... 
     const std::fstream serializeObject(std::fstream &stream); 
    private: 
     void setID(); 
     static int sCount; 
     int id; 
     std::string text; 
     Status status; 
     tm timestamp; 
}; 

的serializeObject這樣定義:

const std::fstream Task::serializeObject(std::fstream &stream) { 
    stream.write((char *) &id, sizeof(int)); 
    stream.write((char *) &text, sizeof(std::string)); 
    stream.write((char *) &status, sizeof(Status)); 
    stream.write((char *) &timestamp, sizeof(tm)); 
    return stream; 
} 

GCC返回不少誤區:

In file included from /usr/include/c++/4.4/ios:39, 
       from /usr/include/c++/4.4/ostream:40, 
       from /usr/include/c++/4.4/iostream:40, 
       from task.cpp:1: 
/usr/include/c++/4.4/bits/ios_base.h: In copy constructor ‘std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)’: 
/usr/include/c++/4.4/bits/ios_base.h:790: error: ‘std::ios_base::ios_base(const std::ios_base&)’ is private 
/usr/include/c++/4.4/iosfwd:47: error: within this context 
/usr/include/c++/4.4/iosfwd: In copy constructor ‘std::basic_fstream<char, std::char_traits<char> >::basic_fstream(const std::basic_fstream<char, std::char_traits<char> >&)’: 
/usr/include/c++/4.4/iosfwd:87: note: synthesized method ‘std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)’ first required here 
/usr/include/c++/4.4/streambuf: In copy constructor ‘std::basic_filebuf<char, std::char_traits<char> >::basic_filebuf(const std::basic_filebuf<char, std::char_traits<char> >&)’: 
/usr/include/c++/4.4/streambuf:770: error: ‘std::basic_streambuf<_CharT, _Traits>::basic_streambuf(const std::basic_streambuf<_CharT, _Traits>&) [with _CharT = char, _Traits = std::char_traits<char>]’ is private 
/usr/include/c++/4.4/iosfwd:78: error: within this context 
/usr/include/c++/4.4/iosfwd: In copy constructor ‘std::basic_fstream<char, std::char_traits<char> >::basic_fstream(const std::basic_fstream<char, std::char_traits<char> >&)’: 
/usr/include/c++/4.4/iosfwd:87: note: synthesized method ‘std::basic_filebuf<char, std::char_traits<char> >::basic_filebuf(const std::basic_filebuf<char, std::char_traits<char> >&)’ first required here 
task.cpp: In member function ‘std::fstream Task::serializeObject(std::fstream&)’: 
task.cpp:104: note: synthesized method ‘std::basic_fstream<char, std::char_traits<char> >::basic_fstream(const std::basic_fstream<char, std::char_traits<char> >&)’ first required here 

我在做什麼錯了?我遵循this的例子。複製了商店功能並適應了一下。

+1

除了已經提到的明顯問題('std :: fstream'沒有拷貝構造函數),你應該用'std :: ostream'來實現你的serialize方法:你不需要嘗試從中讀取,在實現中也不需要特定的fjile流操作。因此,接收並返回一個'std :: ostream&'可以使你的函數更加廣泛地適用。 –

+0

通過返回std :: ostream&獲得什麼優勢?像鏈接?你能解釋一下我的廣泛適用性嗎?謝謝:) – jviotti

+0

是的,你會得到鏈接。 –

回答

3

Task::serializeObject()的返回值是fstream而不是fstream&:這是試圖複製stream並且流是不可複製的。從std::ios_base::ios_base

副本constuctor被刪除:流是不可拷貝

更改爲:

std::fstream& Task::serializeObject(std::fstream &stream) 

注意我已經放棄了const因爲我不能確定爲什麼這將需要。

而且,這樣的:

stream.write((char *) &text, sizeof(std::string)); 

不會做你的想法。 A std::string將包含一個指向實際數據的指針,實際數據將不會被寫入stream。使用std::string::c_str(),可能與std::string::length(),因此重新讀取時字符串的長度是已知的。

+0

非常感謝!關於const,我讀的書推薦使用const來修改不會修改對象屬性的函數。糾正我,如果它是錯誤的:) – jviotti

+0

關於將字符串寫入流,你的意思是這樣的:stream.write((char *)text.c_str(),sizeof(text.length()));? – jviotti