Menu
CoddyTech

Overloading Operator Perbandingan

Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 42 dari 104.

Operator perbandingan seperti ==, !=, <, >, <=, dan >= memungkinkan kamu membandingkan object dari class kustommu. Operator ini mengembalikan bool dan sebaiknya ditandai dengan const karena tidak mengubah kedua operand.

class Date {
    int year, month, day;
    
public:
    Date(int y, int m, int d) : year(y), month(m), day(d) {}
    
    bool operator==(const Date& other) const {
        return year == other.year && 
               month == other.month && 
               day == other.day;
    }
    
    bool operator<(const Date& other) const {
        if (year != other.year) return year < other.year;
        if (month != other.month) return month < other.month;
        return day < other.day;
    }
};

Teknik yang berguna adalah mengimplementasikan operator perbandingan lainnya dengan operator yang sudah kamu definisikan. Setelah memiliki == dan <, operator lainnya dapat dibuat dengan mudah:

bool operator!=(const Date& other) const {
    return !(*this == other);
}

bool operator>(const Date& other) const {
    return other < *this;
}

bool operator<=(const Date& other) const {
    return !(other < *this);
}

bool operator>=(const Date& other) const {
    return !(*this < other);
}

Pendekatan ini mengurangi duplikasi kode dan memastikan semua operator perbandinganmu berperilaku konsisten. Jika nanti kamu mengubah cara kerja kesetaraan atau kurang dari, operator lainnya akan tetap selaras secara otomatis.

challenge icon

Tantangan

Mudah

Mari buat class Version yang merepresentasikan nomor versi perangkat lunak (seperti 2.1.0 atau 3.0.5) dan mendukung keenam operator perbandingan. Ini adalah kasus penggunaan praktis, yaitu membandingkan versi untuk menentukan perangkat lunak mana yang lebih baru. Cocok untuk berlatih melakukan overloading operator perbandingan.

Kamu akan membuat dua file untuk mengatur kodemu:

  • Version.h: Definisikan class Version yang menyimpan tiga bilangan bulat untuk mewakili nomor versi major, minor, dan patch. Class-mu harus mendukung:
    • Constructor yang menerima nilai major, minor, dan patch
    • Getter untuk setiap komponen: getMajor(), getMinor(), getPatch() (semuanya const)
    • Keenam operator perbandingan: ==, !=, <, >, <=, >=
    • Method toString() yang mengembalikan versi sebagai string dengan format "major.minor.patch"

    Implementasikan == dan < secara langsung, lalu definisikan empat operator lainnya berdasarkan kedua operator tersebut. Untuk perbandingan kurang dari, bandingkan major terlebih dahulu, lalu minor jika major sama, kemudian patch jika major dan minor sama. Semua operator perbandingan harus berupa fungsi anggota const.

  • main.cpp: Baca enam bilangan bulat dari input yang mewakili dua versi (major1, minor1, patch1, major2, minor2, patch2, masing-masing pada baris terpisah). Buat dua object Version dan bandingkan keduanya menggunakan semua operator yang kamu buat.

    Format output:

    Version 1: <v1>
    Version 2: <v2>
    v1 == v2: <true/false>
    v1 != v2: <true/false>
    v1 < v2: <true/false>
    v1 > v2: <true/false>
    v1 <= v2: <true/false>
    v1 >= v2: <true/false>

    Cetak true atau false (huruf kecil) untuk setiap hasil perbandingan.

Teknik utamanya adalah mengimplementasikan empat operator turunan (!=, >, <=, >=) hanya menggunakan == dan <. Cara ini mengurangi duplikasi kode dan memastikan semua operator tetap konsisten jika kamu mengubah logika perbandingan.

Ubah string input menjadi bilangan bulat menggunakan std::stoi(). Gunakan std::to_string() untuk menyusun string versi. Jangan lupa menambahkan header guard di file header-mu.

Coba sendiri

#include <iostream>
#include <string>
#include "Version.h"

using namespace std;

int main() {
    // Baca enam bilangan bulat untuk dua versi
    string line;
    
    getline(cin, line);
    int major1 = stoi(line);
    
    getline(cin, line);
    int minor1 = stoi(line);
    
    getline(cin, line);
    int patch1 = stoi(line);
    
    getline(cin, line);
    int major2 = stoi(line);
    
    getline(cin, line);
    int minor2 = stoi(line);
    
    getline(cin, line);
    int patch2 = stoi(line);

    // TODO: Buat dua object Version
    
    // TODO: Tampilkan Version 1 dan Version 2 menggunakan toString()
    
    // TODO: Bandingkan menggunakan keenam operator dan tampilkan hasilnya
    // Gunakan "true" atau "false" (huruf kecil) untuk setiap perbandingan
    // Format: "v1 == v2: true" atau "v1 == v2: false"
    
    return 0;
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler C++ online