如何比较两个结构体实例?

问题描述 投票:0回答:4

我的程序将两个日期与 tda 日期进行比较。该操作必须返回短语“are same”或“are different”:

#include<iostream>
//#include<stdio.h>
#include<string.h> 

using namespace std;

struct tfecha {
    int dia;
    int mes;
    int anio;
};

int main()
{
    tfecha f1,f2;
    cout<<"Ingrese primera fecha:"<<endl;
    cin>>f1.dia;
    cin>>f1.mes;
    cin>>f1.anio;

    cout<<"Ingrese segunda fecha:"<<endl;
    cin>>f2.dia;
    cin>>f2.mes;
    cin>>f2.anio;

    if(strcmp(f1==f2) {
        cout<<"Las fechas son iguales:"<<endl;
    } else {
       cout<<"Las fechas son diferentes:"<<endl;
    }
}

但是,我收到以下错误:

[错误] 'operator ==' 不匹配(操作数类型为 'tfecha' 和 'tfecha')

c++ comparison comparison-operators
4个回答
6
投票

在最新版本的语言标准 C++20 中,该语言提供了可选的默认比较运算符。所以,就你而言:

struct tfecha {
    int dia;
    int mes;
    int anio;
    bool operator==(const tfecha&) const = default;
};

意味着您可以比较

tfecha
的。

要使用 C++20,您必须使用开关

-std=c++20
(对于 g++、clang++)或
/std:c++20
(对于 MSVC)等来调用 C++ 编译器。

看到它正在运行 Godbolt


其他注意事项:

  • 请不要写

    using namespace std
    :
    为什么是“using namespace std;”被认为是不好的做法吗?

  • 您不能将

    strcmp()
    与两个tfecha的比较结果一起使用。

  • 您可以使用以下替代语法来默认比较运算符:

      friend bool operator==(tfecha const&, tfecha const&) = default;
    

    这也有效,因为在较新的 C++ 版本中,您可以在类体内定义友元函数。

  • 我不想鼓励你用英语写作。但是,请注意,如果您的代码不仅要供您所在国家/地区的人们阅读 - 他们很可能会一些英语(因为 C++ 本身是用英语指定的,它的关键字也是如此),不太可能知道字段的意思,并且不太可能意识到

    tefcha
    = t+fecha 并且 fecha 在卡斯特拉诺中表示日期。


2
投票

如果您想将其用于原始类,则必须定义

operator==

此外,

strcmp
用于比较 C 样式字符串(以空字符结尾的字符序列),而不是结构。

#include<iostream>
//#include<stdio.h>
#include<string.h> 
using namespace std;
struct tfecha{
    int dia;
    int mes;
    int anio;

    // define operator==
    bool operator==(const tfecha& t) const {
        return dia == t.dia && mes == t.mes && anio == t.anio;
    }
};
int main()
{
    tfecha f1,f2;
    cout<<"Ingrese primera fecha:"<<endl;
    cin>>f1.dia;
    cin>>f1.mes;
    cin>>f1.anio;

    cout<<"Ingrese segunda fecha:"<<endl;
    cin>>f2.dia;
    cin>>f2.mes;
    cin>>f2.anio;

    // remove strcmp
    if(f1==f2){
      cout<<"Las fechas son iguales:"<<endl;
    }else
    {
       cout<<"Las fechas son diferentes:"<<endl;
    }
 }

0
投票

所以基本上你只需要重载 == 运算符,因为 c++ 不知道如何在你的类中使用它,因此,你需要告诉它如何使用它。尝试这样的事情:


inline bool operator==(const & tfecha lhs, const tfecha& rhs){ 
if(lhs.dia == rhs.dia && lhs.mes == rhs.mes && lhs.anio == rhs.anio){
return true;
}
else{
return false;
}
}

所以你可以看到,你只需检查所有值是否相同,那么我们就可以说这是同一个对象。

请注意,这在技术上不是同一个对象,要检查您只需检查两个对象的内存位置是否相等。 IE。 &lhs == &rhs.


0
投票

在 C++20 中,您现在可以简单地告诉编译器生成比较运算符:

struct tfecha{
    int dia;
    int mes;
    int anio;

    friend auto operator<=>(tfecha const&, tfecha const&) = default;
    friend auto operator==(tfecha const&, tfecha const&) -> bool = default;
};including 

然后所有比较都将起作用,包括顺序运算符和不等于。

© www.soinside.com 2019 - 2024. All rights reserved.