C++集合对象和 iStream 文件输入

C++ Collection Objects & iStream File Input

本文关键字:文件 输入 iStream 集合 对象 C++      更新时间:2023-10-16

我今天一整天都被代码难住了。我有很多课程要处理一系列曲目和专辑。我的代码编译并成功读取文件,但一旦我尝试使用istream&运算符,它在运行时出错。

这就是错误:

error LNK2001: unresolved external symbol "class std::basic_istream<char,struct    std::char_traits<char> > & __cdecl operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,class AlbumCollection &)" (??5@YAAAV?$basic_istream@DU?$char_traits@D@std@@@std@@AAV01@AAVAlbumCollection@@@Z)1>C:UsersShardyDesktopAlbumDatabaseDebugAlbumDatabase.exe : fatal error LNK1120: 1 unresolved externals

我真的很感激你的帮助。它变得令人沮丧。我的书和谷歌都没有任何亮点。谢谢你抽出时间。

一些问题:

  1. main.c:如果文件成功打开,则声明文件已成功加载。为什么要麻烦先打开文件如果它已经装载了?嗯,怎么可能呢
  2. main.c:您永远不会调用任何从文件中读取的方法
  3. main.c:您可以使用if (file)而不是if (file.is_open())
  4. main.c:在if语句中缺少一个结束}
  5. main.c:您没有使用argcargv,因此可以声明main作为CCD_ 8
  6. 您需要发布类声明(头文件)以及方法定义
  7. duration.cpp:当你的输入法遇到不是数字或空格的东西,例如":">
  8. duration.cpp:您的加法运算符不执行时间运算正确,尤其是溢出。尝试添加"00:59:35"00:02:30">
  9. duration.cpp:您的operator==将返回上一次的结果表达式,因为您使用的是逗号","运算符。你可能想要使用CCD_ 10或逻辑AND运算符
  10. duration.cpp:第3条规则:如果定义构造函数,请复制构造函数或销毁,则应声明所有3和赋值运算符
  11. duration.cpp:数学规则:如果您定义operator+operator-您还应该将运算符+=-=实现为好请参见Boost数学库
  12. duration.cpp:订购规则:如果你计划订购或比较,您应该实现运算符<, <=, ==, !=, >,>=。提示:把时间换算成秒,这会让你的生活更轻松进行比较时。请参见boost::less_than_comparable
  13. track.cpp:您的输入法首先读取曲目名称,然后持续时间。数据文件首先显示持续时间,然后显示曲目名称。您也没有代码来处理之间的字段分隔符持续时间和列。

    Yep, adebuggerwould be helpful as well as pencil and paper to go through this code.

很常见的是,在您的main中出现了不匹配的大括号。您的else语句在之前(即} else {...})应该有一个右大括号

更重要的是,我将努力解决你的主体中列出的特定问题(关于汇编)。首先,我列出了我的假设。看起来,由于函数实现使用了作用域(::),所以实现和接口是适当分离的(即,类在头文件中声明,实现在源文件中)。

此外,我假设operator<<的实现与AlbumCollections的实现在同一个文件中。这很好,但是,您的主文件不知道这一点。它目前只针对源文件进行编译。如果没有更多的信息,我想这是你问题的关键。您将需要转发声明此运算符,以便它在其他文件中工作。

在相册集合的头文件中,在AlbumCollection声明之后包括转发声明,如下所示(我假设您在头中没有使用using指令。如果您使用了,则可能不应该使用):

std::istream& operator>>(std::istream& is, AlbumCollection& albums);

您可能需要在标头#include <iostream>中进行正确编译。但是,在任何包含AlbumCollection.h的地方(或调用其相应标头的任何地方),都可以使用此重载。当您将程序链接到一起时,将使用您之前定义的定义。此外,为了实现这一点,您可能需要从定义中删除inline限定符。

请注意,如果这是问题所在,那么错误输出可能看起来非常可怕。如果您有这个问题,许多编译器错误输出将消失,并且调试您可能存在的任何现有代码编译问题将简单得多。