2015-02-14 2 views
0

Я пытаюсь сохранить сложный объект в файл, я перегружаю < < и >> операторы внутри сложного объекта, подобного этомуstd :: ios_base :: ios_base (const std :: ios_base &) является закрытым

class Data { 
public: 
    string name; 
    double rating; 

friend std::ostream& operator<<(std::ostream& o, const Data& p) 
{ 
    o << p.name << "\n"; 
    o << p.rating << "\n"; 
    return o; 
} 

friend std::istream& operator>>(std::istream& o, Data& p) 
{ 
    o >> p.name >> p.rating; 
    return o; 
} 
} 

Затем я использую операторы, чтобы попытаться сохранить массив объекта в файл. Вот класс, содержащий все методы, связанные с файлами:

class FileSave 
{ 
public: 
FileSave() 
{ 
    openFile(); 
    load(); 
} 

~FileSave() 
{ 
    if(editm) 
     outfile.close(); 
    else 
     infile.close(); 
} 

void openFile() 
{ 
    if(editm) 
     outfile.open("flatsave.elo", ios::out | ios::binary); 
    else 
     infile.open("flatsave.elo", ios::in | ios::binary); 
} 

void closeFile() 
{ 
    if(editm) 
     outfile.close(); 
    else 
     infile.close(); 
} 

void save() 
{ 
    changemode(true); 
    outfile << people << endl; 
} 

void load() 
{ 
    changemode(false); 
    for(int i=0; i < 10; i++) 
    { 
     infile >> people[i]; 
    } 
} 

void changemode(bool editmode) 
{ 
    if(editm != editmode) 
    { 
     closeFile(); 
     editm = editmode; 
     openFile(); 
    } 
} 
private: 
ofstream outfile; 
ifstream infile; 
bool editm = false; 
}; 

Где люди это массив объекта данных.

Я пробовал комментировать разные биты, но ошибка все еще возникает, другие потоки говорят, что заголовок моей перегрузки неверен, но я просто копирую письмо для письма, поэтому я немного смущен этим.

Заранее спасибо.

+0

Дайте нам полное сообщение об ошибке. – 0x499602D2

+0

Вы пытаетесь скопировать поток (или, возможно, «FileSave»). –

+0

Очень расплывчатый вопрос. Я могу догадаться о вашей проблеме и рассказать вам, что это такое, но это не хороший пост. –

ответ

0

Ваше использование потоков недействительно. Когда вы используете потоки в качестве членов, вам нужно убедиться, что ваш инкапсулирующий объект не может быть скопирован.

Если вы добавите FileSave(const FileSave&) = delete; (или объявите его закрытым и не реализуете его - если вы работаете с pre C++ 11), вы (я думаю) изменим ошибку компиляции, одну на FileSave (как код, вероятно, делает копию FileSave где-то и не может быть реализован, потому что потоки не могут быть скопированы).

Вместо того чтобы держать объекты потока в области видимости класса, рассмотрит обзорные объекты потока в функции:

void demo_function() 
{ 
    using namespace std; 

    // "Where people is the array of the Data object" 
    vector<Data> people; 

    // load: 
    ifstream in{ "flatsave.elo" }; 
    copy(istream_iterator<Data>{ in }, istream_iterator<Data>{}, 
     back_inserter(people)); 

    // save: 
    ofstream out{ "flatsave.elo" }; // will be flushed and saved 
            // at end of scope 
    copy(begin(people), end(people), 
     ostream_iterator<Data>{ out, "\n" }; 

} // will flush out and save it and close both streams 
+0

Это кажется самой практичной идеей, спасибо! – Precastwig

+0

Эй, я пробовал этот метод, и я получаю сообщение об ошибке в копии, он скулит о istream_iterator {}, говорящем «недостающие аргументы шаблона перед» {'токеном. – Precastwig

+0

@Precastwig, спасибо, я исправил код , – utnapistim

1

Потоки не являются контейнерами; это потоки данных. Таким образом, они не могут быть скопированы, а pre-C++ 11 способ, которым это выполняется, заключается в том, что их конструкторы копирования - private.

Теперь, так как ваш класс FileSave содержит два потока, то есть FileSave не может быть скопирован! Свойство транзитивно. Таким образом, вам нужно будет убедиться, что вы не пытаетесь это сделать, или ввести некоторую косвенность вокруг этих членов.

Смежные вопросы