Как я могу перегрузить cin (>>) вектором объекта - PullRequest
0 голосов
/ 23 октября 2019

Если заголовок не поможет вам понять проблему. Вот фрагмент кода с тем, что я пытаюсь сделать с моим кодом. У меня есть вектор класса объекта Book, и я хочу получить ввод для объекта книги сразу, поэтому я решил его перегрузить. И во время операции pushback он запрашивает версию >> класса. Так что я сделал это, но все равно не могу принять ввод

class Book{
friend istream &operator>>(istream &in,Book &b);

    string name;
    unsigned int id;
    unsigned int no;

};
class Booklist{
    vector<Book>b;
    void addBook();
};
istream &operator>>(istream &in,Book &b)
{
   // cout<<"Enter book id , no and name :"<<endl; as suggested lets discard it but still its error prone
    cin>>b.id>>b.no>>b.name;
    return in;
}
void Booklist::addBook()
{
    int check;
    while(cin>>check){
        try{
            cout<<"Enter book serial number - "<<endl;
            cin>>b.push_back(); // Here is the error part
            if(cin){
                throw runtime_error("Input failed.\n");}
        }
        catch(runtime_error error){
            cout<<error.what()
                <<"Try again? Enter y or n.\n";
                char c;
                cin>>c;
                if(!cin || c=='n'){
                    break;
                }
        }
    }
}




***ERRORS IN COMPILER***

In member function 'void Booklist::addBook()':|
no matching function for call to 'std::vector<Book>::push_back()'|
note: candidate: void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = Book; _Alloc = std::allocator<Book>; std::vector<_Tp, _Alloc>::value_type = Book]|
candidate expects 1 argument, 0 provided|
candidate: void std::vector<_Tp, _Alloc>::push_back(std::vector<_Tp, _Alloc>::value_type&&) [with _Tp = Book; _Alloc = std::allocator<Book>; std::vector<_Tp, _Alloc>::value_type = Book]|
note:   candidate expects 1 argument, 0 provided|

1 Ответ

3 голосов
/ 23 октября 2019

Ваше основное недоразумение заключается в том, что функция push_back() (обратите внимание на пустые скобки) не существует, и компилятор не знает, что с ней делать в сочетании с cin >>.

push_back(Book b) существует, но вы должны предоставить временный объект Book, например, так:

        Book book;
        cin >> book; // no more error
        b.push_back(book);
...