1

クラスのいくつかのプライベート属性をシリアル化しようとしています:

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 

私は何が間違っているのですか?この例に従っています。ストア機能をコピーし、少し適応させました。

4

1 に答える 1

3

の戻り値Task::serializeObject()は、fstreamではなく、fstream&です。これはコピーを作成しようとしてstreamおり、ストリームはコピーできません。差出人std::ios_base::ios_base

コピーコンストラクタが削除されます:ストリームはコピーできません

への変更:

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

constなぜこれが必要になるのかわからないので、私はを削除したことに注意してください。

また、これ:

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

あなたが思うことをしません。Astd::stringには実際のデータへのポインタが含まれ、実際のデータはstreamこれを使用して書き込まれません。を使用std::string::c_str()します。おそらくstd::string::length()、文字列の長さが再読み込み時にわかるようにします。

于 2012-10-07T21:28:38.570 に答える