C++ 用istream_迭代器构造自定义类型的向量

C++ 用istream_迭代器构造自定义类型的向量,c++,serialization,stl,fstream,stdvector,C++,Serialization,Stl,Fstream,Stdvector,我想将我的类类型的STL向量写入并读取到二进制文件中,但不明白istream_迭代器有什么问题。 项目规则不允许使用文本文件, 与Boost等第三方库相同 这是一本书 class Book{ public: Book(const std::vector<Book>& in_one_volumes,const std::string& title, const std::string& author,const int pagecount

我想将我的类类型的STL向量写入并读取到二进制文件中,但不明白istream_迭代器有什么问题。
项目规则不允许使用文本文件, 与Boost等第三方库相同

这是一本书

class Book{
    public:
    Book(const std::vector<Book>& in_one_volumes,const std::string& title,
    const std::string& author,const int pagecount,const int price,const std::string& date);
    private:
    std::vector<Book> inOneVolumes;
    std::string title;
    std::string author;
    int pagecount;
    int price;
    std::string date;
};
教材{
公众:
书籍(const std::vector&in_one_volumes,const std::string&title,
const std::string和author、const int pagecount、const int price、const std::string和date);
私人:
std::载体inOneVolumes;
std::字符串标题;
字符串作者;
整数页计数;
国际价格;
std::字符串日期;
};
这是一种写入方法:

void writeBook(std::vector<Book> books) {
    std::ofstream binOut("book.bin", std::ios::binary);
    std::copy(books.begin(), books.end(),
        std::ostream_iterator<Book>(binOut, "\n")); 
}
void编写本(标准::矢量书){
std::ofstreambinout(“book.bin”,std::ios::binary);
std::copy(books.begin(),books.end(),
std::ostream_迭代器(binOut,“\n”);
}
我想这样读:

std::vector<Book> readBooks() {
    std::vector<Book> toReturn;
    std::ifstream BinIn("book.bin", std::ios::binary);
    std::istream_iterator<Book> file_iter(BinIn);
    std::istream_iterator<Book> end_of_stream;
    std::copy(file_iter, end_of_stream, std::back_inserter(toReturn));
    return toReturn;    
}
std::vector readBooks(){
std::向量回归;
std::ifstream BinIn(“book.bin”,std::ios::binary);
std::istream迭代器文件(BinIn);
std::istream\u迭代器\u流的结束\u;
std::copy(文件插入器、流结束器、std::back\u插入器(返回));
回归回归;
}

编译器说--Book:没有合适的默认构造函数可用。

std::istream\u迭代器使用
operator>(std::istream&,Book&)
将数据读入对象。由于此
运算符>>
需要一个现有的
Book
对象作为参数(将数据写入),迭代器必须先构造一个对象,然后才能将数据从流转储到其中,为此,迭代器需要一个默认构造函数

你的
类没有。解决这个问题最简单的办法就是给它一个

如果这不是一个选项(例如,如果
Book
保证默认构造函数不能提供不变量),您可以引入一个可默认构造的中间数据传输类,可以通过
operator>
填充数据,并可以转换为
Book
。草图:

class TransferBook {
public:
  // To read data from stream
  friend std::istream &operator>>(std::istream &in, TransferBook &dest);

  // Conversion to Book. Use the non-default Book constructor here.
  operator Book() const {
    return Book(all the data);
  }

private:
  // all the data
};

...

std::vector<Book> books;
std::ifstream file;

// Note that books contains Books and the iterator reads TransferBooks.
// No Book is default-constructed, only TransferBooks are.
std::copy(std::istream_iterator<TransferBook>(file),
          std::istream_iterator<TransferBook>(),
          std::back_inserter(books));
类转移簿{
公众:
//从流中读取数据
friend std::istream&operator>>(std::istream&in、TransferBook&dest);
//转换为书本。在此处使用非默认书本构造函数。
运算符Book()常量{
归还书(所有数据);
}
私人:
//所有数据
};
...
矢量书;
std::ifstream文件;
//请注意,books包含books,迭代器读取TransferBooks。
//默认情况下不构造任何帐簿,只构造TransferBooks。
std::copy(std::istream_迭代器(文件),
std::istream_迭代器(),
标准:背面插入器(书籍);
可以肯定的是,这种方法相当麻烦,而且基本上重复了代码,而且可能给
Book
默认构造函数带来的麻烦更少。但是,如果不能以这种方式更改
Book
,这是一种可能的解决方法