Menu
CoddyTech

Fungsi dan class friend

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

Terkadang, fungsi atau class di luar class-mu perlu mengakses anggota privatnya. Alih-alih menjadikan anggota tersebut publik, C++ menyediakan kata kunci friend untuk memberikan akses secara selektif sambil tetap menjaga enkapsulasi.

Fungsi friend dideklarasikan di dalam sebuah class, tetapi bukan merupakan anggota class tersebut. Fungsi ini dapat mengakses anggota private dan protected dari class tersebut:

class Box {
    double width;
    
public:
    Box(double w) : width(w) {}
    
    // Deklarasikan printWidth sebagai friend
    friend void printWidth(const Box& b);
};

// Definisi fungsi friend, BUKAN fungsi anggota
void printWidth(const Box& b) {
    std::cout << b.width;    // Dapat mengakses anggota private
}

Perhatikan bahwa printWidth didefinisikan di luar class tanpa operator resolusi cakupan. Ini adalah fungsi biasa yang kebetulan memiliki hak akses khusus.

Kamu juga bisa menjadikan seluruh class sebagai friend, sehingga semua fungsi anggotanya dapat mengakses anggota private:

class Engine {
    int horsepower;
    
    friend class Mechanic;    // Mechanic dapat mengakses anggota privat
    
public:
    Engine(int hp) : horsepower(hp) {}
};

class Mechanic {
public:
    void diagnose(const Engine& e) {
        std::cout << e.horsepower;    // Diizinkan, karena Mechanic adalah friend
    }
};

Pertemanan tidak bersifat timbal balik. Jika Engine menyatakan Mechanic sebagai friend, Mechanic dapat mengakses member privat milik Engine, tetapi sebaliknya tidak. Gunakan friend secukupnya, karena friend menciptakan coupling yang erat antara class. Friend paling berguna untuk operator overloading dan fungsi helper yang berkaitan erat.

challenge icon

Tantangan

Mudah

Mari kita buat sistem pesan aman yang memungkinkan class MessageReader mendapat akses khusus untuk membaca pesan terenkripsi yang disimpan dalam class SecureMessage. Ini adalah situasi yang tepat untuk menggunakan fungsi friend dan class friend.

Kamu akan membuat dua file untuk mengatur kodemu:

  • SecureMessage.h: Definisikan class SecureMessage yang menyimpan data pesan privat dan memberikan akses selektif kepada entitas tepercaya. Class-mu harus memiliki:
    • Anggota privat: content (string) dan secretKey (int)
    • Konstruktor yang menerima content dan secret key
    • Deklarasikan MessageReader sebagai class friend agar dapat mengakses anggota privat
    • Deklarasikan fungsi friend decryptMessage(const SecureMessage& msg, int key) yang mengembalikan content hanya jika key yang diberikan cocok dengan secret key, jika tidak, mengembalikan "Access Denied"

    Lalu definisikan class MessageReader dalam file header yang sama:

    • Method readContent(const SecureMessage& msg) yang mengakses langsung dan mengembalikan content privat pesan
    • Method verifyKey(const SecureMessage& msg, int key) yang memeriksa apakah key yang diberikan cocok dengan secretKey pesan, lalu mengembalikan "Valid" atau "Invalid"

    Terakhir, definisikan fungsi friend decryptMessage setelah class-class tersebut.

  • main.cpp: Peragakan cara kerja fungsi friend dan class friend. Baca content pesan, secret key, dan test key dari input, masing-masing pada baris terpisah, lalu:
    • Buat SecureMessage dengan content dan secret key
    • Buat object MessageReader
    • Cetak "Reader access: <content>" menggunakan method readContent() dari reader
    • Cetak "Key verification: <result>" menggunakan verifyKey() dengan test key
    • Cetak "Decrypt with test key: <result>" menggunakan fungsi friend dengan test key
    • Cetak "Decrypt with correct key: <result>" menggunakan fungsi friend dengan secret key asli

Ingat, fungsi friend didefinisikan di luar class tanpa operator resolusi scope: fungsi ini adalah fungsi biasa dengan hak akses khusus. Class MessageReader, sebagai friend, dapat mengakses langsung anggota privat SecureMessage dalam semua method-nya.

Ubah input key dari string menjadi integer menggunakan std::stoi(). Sertakan file header-mu di main.cpp menggunakan #include "SecureMessage.h".

Coba sendiri

#include <iostream>
#include <string>
#include "SecureMessage.h"
using namespace std;

int main() {
    // Baca input
    string messageContent;
    string secretKeyStr;
    string testKeyStr;
    
    getline(cin, messageContent);
    getline(cin, secretKeyStr);
    getline(cin, testKeyStr);
    
    int secretKey = stoi(secretKeyStr);
    int testKey = stoi(testKeyStr);
    
    // TODO: Buat SecureMessage dengan konten dan kunci rahasia
    
    // TODO: Buat object MessageReader
    
    // TODO: Cetak "Reader access: <content>" menggunakan readContent()
    
    // TODO: Cetak "Key verification: <result>" menggunakan verifyKey() dengan kunci uji
    
    // TODO: Cetak "Decrypt with test key: <result>" menggunakan decryptMessage dengan kunci uji
    
    // TODO: Cetak "Decrypt with correct key: <result>" menggunakan decryptMessage dengan kunci rahasia
    
    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