尝试使用运算符“==”来比较同一类的两个对象

3
我时间紧迫,不知道如何让这个程序正常工作。我对C++和编程一般都很新,我们现在才开始学习类、重载运算符和一些文件操作,而我们必须在我们的程序中使用这些技术。程序非常庞大,基本上是测试类似于mp3播放器(如iPod)的功能。以下是详细说明:
1)我们必须创建两个类:Tsupod和Songs,程序中所有歌曲将保存在“list.dat”文件中。
2)我们必须以二进制模式读取列表,在列出存储的所有歌曲时进行写入和读取,并使用文件操作查找文件中需要删除或移动的歌曲位置……特别是当我需要编码洗牌函数时。
3)这些都在五个不同的文件中完成……显然,在Linux系统中,使用reinterpret_cast进行读取和写入不起作用,但在Windows系统中可以。
下面是我在公共成员下尝试在Songs类中实现的内容...
    //overloaded operator '==' ...
     bool operator ==( Songs& b)
    {   
        if (strcmp(Title, b.Title) > 1)
            return false;
        else if (strcmp(Artist, b.Artist) > 1)
            return false;
        else if (size != b.size)
            return false;
        else
            return true;
    }

private:
    char Artist[30];
    char Title[30];
    int size;
};#endif // SONGS_H_INCLUDED

这里是TsuPod.cpp的代码,位于int tsupod::removeSong(string removeTitle, string emoveArtist)中,我正在尝试实现它……从main函数调用的字符串removeTitle和removeArtist:Pod.removeSong("blah", "blahblah")。其中Pod是tsupod类的对象。在removeSong函数中调用了song类,将艺术家和标题转换为字符数组。songFile中的标记被重置。

for(int i = 0; i < num_songs; i++)
{
    songFile.read(reinterpret_cast<char*>(&info), sizeof(info));
    pos = sizeof(info) * count;
    songfile.seekp(pos - sizeof(info));

    if (S == info)
    {
        num_songs--;    
    }
    else
    {
        songFile.write(reinterpret_cast<char*>(&info), sizeof(info));
        count++
    }
}

我在这个函数中的目标是覆盖文件中的数据,以免以后需要处理文件中的空缺。我已经尝试了很多方法...重命名旧文件并创建一个新文件,或者使用字符数组来保存信息。在此程序中,Songs对象基本上用作大型缓冲区,用于保存将存储到文件中的信息。
我遇到的主要问题是,我正在尝试比较同一类别的两个对象:“S”和“info”。在说任何话之前,对于这个特定的任务,我不允许使用数组,因为整个重点是让像我这样的学生花费26个小时以上(根据我的教授)练习文件操作。我也相当确定我的重载==运算符不起作用,因为它会在每次迭代时跳过条件。这可能是我错过的非常简单的东西,就像那一次我花了3个小时寻找一个缺少的分号一样。如何使这个==运算符在这种情况下工作?
如果有人能够真正帮助我快速解决这个问题,我将真诚地赞扬你,因为你拯救了我的屁股,使我没有获得A+的荣耀。

将您的参数更改为const引用,以便您可以处理const对象和临时对象。 - chris
变量'S'和'info'是什么类型?Song类有基类吗? - hotpotato
3个回答

5
您正在错误地使用 strcmp。您应该使用 strcmp(char*, char*) != 0(以查看两个 C 字符串是否不相等),而不是比较 strcmp(char*, char*) > 1。请参阅文档:

一个零值表示两个字符串相等。 大于零的值表示第一个不匹配的字符在 str1 中具有比在 str2 中更大的值;小于零的值表示相反。


2
如果您将> 1更改为!= 0,则应该可以正常工作。
    if (strcmp(Title, b.Title) != 0)
        return false;
    else if (strcmp(Artist, b.Artist) != 0)
        return false;
    return (size == b.size);

我还简化了代码,只用了一行return size == b.size来代替你的四行代码实现同样的功能。


0

在运算符定义中,您错过了const,并且错误地检查了strcmp的结果。
此外,将等号运算符定义为const是一个好习惯,即将其声明为不会更改类数据。
还有一点不是很重要,但通常将用于比较的对象命名为rhs(右手边)。

因此,最终应该是:

bool operator==(const Songs& rhs) const
{   
    return (strcmp(Title, rhs.Title) == 0) &&
           (strcmp(Title, rhs.Title) == 0) &&    
           (size == rhs.size);
}
private:
    char Artist[30];
    char Title[30];
    int size;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接