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

时间:2013-04-04 02:22:18

标签: c++

我的时间紧迫,而且我已经没有关于如何让这个程序工作的想法了。我对c ++和编程很新,我们刚刚学习类,重载操作符和一堆文件操作,我们必须在程序中使用它们。这很冗长。该程序基本上测试类似于MP3播放器(例如ipod)的功能。这是细分:

1)我们必须创建两个类:Tsupod和Songs,程序中的所有歌曲都将存储在“list.dat”中。

2)我们已经以二进制模式读取列表,写出来,在列出存储的所有歌曲时读入,并使用文件操作在文件中找到我们必须找到要删除或要移动的歌曲的点在文件中...特别是当我必须为shuffle编写函数时。

3)这些都是在五个不同的文件中完成的...显然,使用reinterpret_cast读取和写入在linux系统中不起作用,但它适用于Windows。

这里我想在公共成员的歌曲课上做...

    //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

这里是int tsupod :: removeSong(string removeTitle,string emoveArtist)中的代码TsuPod.cpp,我正在尝试实现它...字符串removeTitle和remove artist来自main中的函数调用:Pod .removeSong(“blah”,“blahblah”);其中Pod是类tsupod的对象。 song类在removeSong函数中调用,其中艺术家和标题被转换为字符数组。标志在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++
    }
}

我在这个函数中尝试做的是覆盖文件中的数据,所以我不会在文件中有任何空白,以后我将不得不处理。我还尝试了很多方法来解决这个问题...重命名旧文件,然后使用旧文件名创建一个新文件,或者保存信息的字符数组。此程序中的歌曲对象基本上用作保存信息的大缓冲区,然后将信息存储到文件中。

我遇到的主要问题是我正在尝试比较同一类的两个对象。 “S”和“信息”。在说任何事情之前我不允许使用ARRAYS来完成这个特定的任务,因为根据我的教授执行档案操作,对于像我这样的学生来说,整个过程大约需要花费26个小时。我也很确定这是我的重载==运算符不能正常工作,因为它总是会跳过条件每次迭代。这可能是非常简单的,我错过了就像有一次我花了3个小时寻找丢失的分号。我怎样才能得到这个==操作员在这种情况下工作?

如果有人真的可以帮我快速解决这个问题,我会用一千个太阳的荣耀来赞美你,以免我的屁股在这个项目上没有获得A +。

3 个答案:

答案 0 :(得分:5)

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

  

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

答案 1 :(得分:2)

如果更改> 1的{​​{1}},则应该有效。

!= 0

我还将大小简化为 if (strcmp(Title, b.Title) != 0) return false; else if (strcmp(Artist, b.Artist) != 0) return false; return (size == b.size); 而不是你的四行来做同样的事情。

答案 2 :(得分: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;