类和 int 的 getline 等效,也'no viable overloaded ='错误

Getline equivalent for class and int, and also 'no viable overloaded =' error

本文关键字:viable no overloaded 错误 int 等效 类和 getline      更新时间:2023-10-16
class Book{
public:
string _title;
string _author;
string _publisher;
Date _published;
float _price;
string _isbn;
int _page;
int _copies;

Book(void);
Book(string, string, string, Date, float, string, int, int);
};
Book::Book(void)
{
 _title = "";
 _author = "";
 _publisher = "";
 _published = 0;
 _price = 0;
 _isbn = "";
 _page = 0;
 _copies = 0;

其中 Date 是一个类,包括日、月和年的整数。这将生成一个不可行的重载 = 错误。

int main(void)
{
LinkedList myList;
ifstream myFile("sample.txt");
string title;
string author;
string publisher;
Date published;
float price;
string isbn;
int page;
int copies;

while( myFile )
{
getline(myFile,title);
getline(myFile,author);
getline(myFile,publisher);
getline(myFile,published);
getline(myFile,price);
getline(myFile,isbn);
getline(myFile,page);
getline(myFile,copies);
myList.insert_rear(new    Book(title,author,publisher,published,price,isbn,page,copies));
}
myList.print_list();
return 0;

}

对于getline publish(Date class(,price(int(,page(int(和copyies(int(,我得到了一个没有匹配的getline函数调用。我知道getline是针对字符串的,所以我预料到了这个错误。我能做什么呢?

谢谢,如果您需要查看更多代码,请告诉我。

不能简单地std::getlineint中。认真地。这比走进魔多更难。

有几种方法可以做到这一点。

一种是混合std::getline和使用>>运算符。但

myFile >> price;
getline(myFile,isbn);

不起作用,因为myFile >> price;会让流中的行尾被getline(myFile,isbn)吞噬,从而导致 isbn 中的空字符串。一些简单的东西,比如

char end_of_line;
myFile >> price >> end_of_line;
getline(myFile,isbn);

将完成这项工作,假设您的文件严格遵守格式。

myFile >> price;
myFile.ignore(numeric_limits<streamsize>::max(), 'n');
getline(myFile,isbn);

更安全。它丢弃所有内容,包括行尾。

可悲的是,除非你为Date写了operator>>,否则你不能用published做到这一点。

下一个不错的选择是将所有内容作为字符串读取,然后在调用 Book 构造函数之前将其转换为适当的数据类型。类似的东西

int main()
{
    ifstream myFile("sample.txt");
    string title;
    string author;
    string publisher;
    string published;
    string price;
    string isbn;
    string page;
    string copies;
    while (getline(myFile, title) &&
           getline(myFile, author) &&
           getline(myFile, publisher) &&
           getline(myFile, published) &&
           getline(myFile, price) &&
           getline(myFile, isbn) &&
           getline(myFile, page) &&
           getline(myFile, copies))
    {
        myList.insert_rear(new Book(title,
                                    author,
                                    publisher,
                                    string_to_date(published), // function does not exist 
                                    stof(price),
                                    isbn,
                                    stoi(page),
                                    stoi(copies)));
    }
    return 0;
}

题外话:注意所有getline都在while除非成功读取所有输入,否则这不会进入循环的主体。

while( myFile )

读取所有值之前,在开始时测试好坏度。所有这些都告诉你,你读到的最后一件事是好的。它不保证您将阅读的下一篇文章的质量。目前,getline(myFile,title);可能会失败以及之后的所有内容,您将使用无效读取的结果构建新Book。始终阅读,测试您是否阅读了良好的信息,然后才使用您阅读的内容。

可能最好的方法是采用上述两种方法中的任何一种,并将它们构建成Book operator>>

然后你可以

int main()
{
    ifstream myFile("sample.txt");
    Book temp;
    while (myFile >> temp)
    {
        myList.insert_rear(new Book(temp));
    }
    return 0;
}

这甚至很容易摆脱分配的Book,这是值得的黄金重量。