Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 尝试使用“运算符”==&引用;比较同一类的两个对象_C++ - Fatal编程技术网

C++ 尝试使用“运算符”==&引用;比较同一类的两个对象

C++ 尝试使用“运算符”==&引用;比较同一类的两个对象,c++,C++,我的日程排得很紧,关于如何让这个项目运作的想法也快用完了。一般来说,我对C++和编程非常陌生,我们现在正在学习类、重载运算符和一堆文件操作,这是我们在程序中必须使用的。相当长。该程序基本上是在测试类似于mp3播放器(例如ipod)的功能。以下是分类: 1) 我们必须创建两个类:Tsupod和Songs,程序中的所有歌曲都将存储在“list.dat”中 2) 我们以二进制模式读取列表,在列出存储的所有歌曲时写入、读入,并使用文件操作在文件中查找需要删除或在文件中四处移动的歌曲的点…特别是当我必须为

我的日程排得很紧,关于如何让这个项目运作的想法也快用完了。一般来说,我对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的对象。在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++
    }
}
for(int i=0;i
我试图在这个函数中做的是覆盖文件中的数据,这样我就不会在文件中有任何间隙,我以后将不得不处理这些间隙。我也尝试了很多方法来实现这一点…重命名旧文件,然后用旧文件名或字符数组创建一个新文件来保存信息。这个程序中的歌曲对象基本上被用作巨大的缓冲区来保存信息,然后这些信息将被存储到一个文件中

我遇到的主要问题是,我试图比较同一类的两个对象。“S”和“info”。在说任何事情之前,我不允许在这个特殊的作业中使用数组,因为整个要点是对像我这样的学生来说,根据我的教授练习的文件操作,在这方面花费了大约26个多小时。我也很确定是重载==运算符不起作用,因为每次迭代它都会跳过条件。这可能是我遗漏的非常简单的事情,就像有一次我花了3个小时寻找丢失的分号一样。在这种情况下,如何使这个==运算符工作


如果有人真的能帮我迅速解决这个问题,我会用一千个太阳的荣耀来郑重地赞扬你,因为你救了我,让我在这个项目上没有获得a+

您使用的strcmp
不正确。不要比较
strcmp(char*,char*)>1
,你应该做
strcmp(char*,char*)!=0(查看两个C字符串是否不相等)。请参阅文档:

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


如果更改
>1
,则应该可以正常工作0

    if (strcmp(Title, b.Title) != 0)
        return false;
    else if (strcmp(Artist, b.Artist) != 0)
        return false;
    return (size == b.size);

我还将大小简化为
returnsize==b.size
,而不是您的四行代码来做同样的事情

您在运算符定义中遗漏了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;

将参数更改为常量引用,这样就可以获取常量对象和临时变量。变量的“S”和“info”是什么类型的?Song类有基类吗?