Pointer Objects yordamida taqqoslash cpp

myclass sinfidagi ikkita ko'rsatgich obyektini yarataman '

myclass *obj1,*obj2;

can I compare these two objects using comparison operator and pointer expression i.e *obj1==*obj2

If yes, how does it happen?
If not, why isn't his allowed?

0
Sizning ikkita ko'rsatgichingiz haqiqiy narsalarga ishora qilyaptimi yoki ularsizsizmi? Agar ikkinchisi siz * operatori bilan ishlashni to'xtatishga harakat qilsangiz, aniqlanmagan xatti-harakatlar qilasiz (va ehtimol, dasturingiz qulashi)
qo'shib qo'ydi muallif Jeremy Friesner, manba
C ++ - C emas va "cpp" - til emas.
qo'shib qo'ydi muallif n.m., manba

6 javoblar

== operator on pointers will compare their numeric address and hence determine if *obj1 and *obj2 points to the same object or not.

bool operator==(const myclass &obj2);//in this method, see if obj2 is equal to *this.
0
qo'shib qo'ydi

Ikki moslamani taqqoslash operatori va pointer ifodasi yordamida solishtirishim mumkin. * obj1 == * obj2

Sinaktika bilan aytganda, agar operator sinf uchun aniqlangan bo'lsa, buni amalga oshirishingiz mumkin. Buni a'zo funktsiyasi yoki a'zo bo'lmagan funktsiya bo'lishi mumkin bo'lgan operator == funktsiyasini ortiqcha yuklash orqali amalga oshirishingiz mumkin.

Faqat obj1 va obj2 joriy moslamalarni ko'rsatganda faqat ish vaqti davomida ishlaydi.

Agar obj1 va obj2 mos moslamalarni ko'rsatadigan bo'lsa, * obj1 == * obj2

MyClass o1;
MyClass o2;

and used o1 == o2

0
qo'shib qo'ydi

Ha bo'lsa, qanday bo'ladi?   Agar bo'lmasa, nima uchun unga ruxsat yo'q?

Qisqa qilib aytganda myclass misollarni taqqoslash uchun operator == funktsiyasini aniqlaganingizda yes javob bo'ladi va no Agar tegishli operator == funktsiyasini aniqlamagan bo'lsangiz.

MyClass sinfining a'zolik funktsiyasi sifatida yoki operator == funktsiyasini e'lon qilishning ikkita usuli mavjud (yoki ba'zan global funktsiya yoki erkin funksiya deb ataladi) ).

MyClass a'zo funktsiyasini e'lon qilish bu kabi ko'rinishi mumkin ...

class MyClass
{
public:

    bool operator == (const MyClass &rhs) const
    {
        bool result{ false };

       //calculate result;

        return result;
    }

   //... etc ...
};

Agar if (* obj1 == * obj2) so'zini ko'rib chiqsak, yuqoridagi funktsiya * obj1 misolida chaqiriladi (ya'ni this ) * obj2 misoli rhs parametresinin mustaqil o'zgarishi sifatida qabul qilinganda * obj1 ga qarang.

Shu bilan bir qatorda, MyClass uchun tenglik taqqoslash operatori a'zo bo'lmagan (aka global) funktsiya sifatida e'lon qilinishi mumkin ...

bool operator == (const MyClass &lhs, const MyClass &rhs) 
{
    bool result{ false };

   //calculate result;

    return result;
}

Bu holda if (* obj1 == * obj2) so'zini hisobga olgan holda yuqoridagi funktsiya * obj1 misolida lhs parametri va * obj2 misoli rhs parametresinin mustaqil o'zgaruvchilar sifatida qabul qilindi.

Birgalikdagi imzo yordamida ham a'zo funktsiyasini, ham a'zo bo'lmagan funktsiyani operator == deb e'lon qila olmaysiz. Derleyici qanday qo'ng'iroq qilishni hal qila olmaydi!

Agar operator == funktsiyasini e'lon qilish uchun foydalanadigan qaysi texnikni qo'llasa, "hisoblash natijasi" kodi true qaytarsa, yoki FALSE .

Odatda siz ikkita moslamaning turli a'zolarini taqqoslaysiz va agar o'sha a'zolar bir xil qadriyatlarga ega bo'lsalar, rostini qaytarasiz. Lekin barcha a'zolarini solishtirmasligingiz mumkin. Misol uchun, quyidagi Book sinfini ko'rib chiqing ...

class Book
{
public:

   std::string Title;
   std::string Author;
   std::string Isbn;

  //... etc ...
};

Agar "Galaktikada Hitchhiker's Guide" deb nomlangan kitobning turli nashrlari turli xil deb hisoblanishi kerak bo'lsa, ikkita misol ISBN qiymatiga teng bo'lsa, operator == . Shu bilan bir qatorda, qo'llanmaning qog'ozli va qattiq versiyalari turli xil bo'lishi mumkin, chunki Title va Author bir xil bo'lsa, Book ISBN-lar, lekin ular hali ham (bir ma'noda) bir xil kitob.

Finally(!) it should be noted that while the sample code above uses const MyClass & as the type for the rhs parameter C++ does not require that the rhs parameter be the same type as the lhs parameter.

Odatda, bu ikkita xil turdagi qiyoslashni taqqoslaydigan, operator == funktsiyasini belgilaydi va o'quvchilarni aralashtirib yuborishi mumkin va sinfni ishlatgan dasturchilar uchun muammolarga olib kelishi mumkin. Ammo, ko'p hollarda, siz nima qilayotganingizni bilsangiz, C ++ sizni qabul qilmaydi.

Taqqoslash operatorlari haqida ko'proq ma'lumotga ega bo'lishni istasangiz, siz http://en. cppreference.com/w/cpp/language/operator_comparison qiziqarli.

0
qo'shib qo'ydi

Siz taklif qilayotgan kod faqat myclass operator == belgilagan holda ishlaydi.

Jeremy Friesner ta'kidlaganidek, bekor ko'rsatgichlardan, ayniqsa NULL (yoki nullptr) qiymatidan ehtiyot bo'lishingiz kerak.

So what you really want is: if ((obj1 != nullptr) && (obj2 != nullptr( && (*obj1 == *obj2)) ...

Bundan tashqari, "obj1" va "obj2" kabi narsalarni identifikatorlarni ptr1 va ptr2-ga o'zgartirishni tavsiya qilaman. Yoki myclsptr1 va myclsptr2, kitobxonlarga qanday ishora qilayotganini ko'rsatadigan belgi. Yaxshiyamki, dasturning ushbu qismida maqsadlarini belgilaydigan ismlar yaxshi.

0
qo'shib qo'ydi

1. Sinfga borish uchun xuddi shunday o'xshash - bir tuzuvchiga ko'rsatgich, agar siz taqqoslashni istasangiz, har bir a'zoga kirish va taqqoslashingiz kerak.

obj1 == obj2 (manzilni taqqoslaydigan) bilan solishtirishingiz mumkin, lekin ikki ob'ektni solishtirish uchun * obj1 == * obj2 = "" == " operatoringiz " myclass " da shunga o'xshash :::

bool operator==(const myclass& b) {//Compare methods or variables of both objects and return result bool(true/false)

0
qo'shib qo'ydi

Ha, bu ishlaydi, lekin agar siz o'z sinfingiz uchun == operatorini haddan tashqari yuklab olgan bo'lsangiz. Agar sizda bo'lsa, u holda == sizning sinfingiz uchun tenglik sinovini amalga oshiradigan tegishli operator == usulini chaqiradi. Boshqacha qilib aytganda, sizning sinfingiz uchun tenglik nimani anglatishini aniqlashingiz kerak.

0
qo'shib qo'ydi