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.
Tantangan
MudahMari 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 classSecureMessageyang menyimpan data pesan privat dan memberikan akses selektif kepada entitas tepercaya. Class-mu harus memiliki:- Anggota privat:
content(string) dansecretKey(int) - Konstruktor yang menerima content dan secret key
- Deklarasikan
MessageReadersebagai 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
MessageReaderdalam file header yang sama:- Method
readContent(const SecureMessage& msg)yang mengakses langsung dan mengembalikancontentprivat pesan - Method
verifyKey(const SecureMessage& msg, int key)yang memeriksa apakah key yang diberikan cocok dengansecretKeypesan, lalu mengembalikan"Valid"atau"Invalid"
Terakhir, definisikan fungsi friend
decryptMessagesetelah class-class tersebut.- Anggota privat:
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
SecureMessagedengan content dan secret key - Buat object
MessageReader - Cetak
"Reader access: <content>"menggunakan methodreadContent()dari reader - Cetak
"Key verification: <result>"menggunakanverifyKey()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
- Buat
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;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar-Dasar OOP
File EksternalBuild dan Kompilasi C++File Header dan File SourceNamespace dan CakupanPengantar OOP dalam C++class vs objectPointer 'this'method (Fungsi Anggota)Atribut (Anggota Data)Dasar Ctor dan DtorRingkasan: Kalkulator Sederhana4Properti class
Anggota instance vs staticGetter dan setterFungsi anggota constKata kunci mutableMethod dan variabel staticFungsi dan class friendRangkuman, Pengelola Rekening Bank7Pewarisan
Pewarisan DasarTingkat Akses pada PewarisanUrutan Pemanggilan Ctor & DtorPenimpaan methodFungsi Virtual & VTablePewarisan BergandaPewarisan VirtualRangkuman: Hierarki Karyawan2Manajemen Memori
Memori Stack vs HeapPointer dan ReferenceMemori Dinamis (new/delete)Smart Pointer di C++RAII di C++Rangkuman: Pengelola Array Dinamis5Enkapsulasi
Penentu Akses dalam C++Penentu Akses secara MendalamPenyembunyian Informasistruct vs classNested dan Inner classRangkuman, Sistem Catatan Siswa8Polimorfisme
Polimorfisme saat Compile vs RuntimeOverloading FungsiMeninjau Kembali Fungsi VirtualFungsi Virtual MurniKelas AbstrakDesain Interface di C++Casting Dinamis & RTTIRangkuman: Kalkulator Bentuk3Konstruktor & Destruktor
Konstruktor DefaultKonstruktor BerparameterKonstruktor SalinKonstruktor PindahDaftar Inisialisasi KonstruktorKonstruktor DelegasiKupas Tuntas DestruktorAturan Tiga, Lima, dan NolRangkuman: class String6Overloading Operator
Pengantar Overloading OperatorOverloading Operator AritmetikaOverloading Operator PerbandinganOperator StreamOverloading Operator PenugasanOverloading Operator [] dan ()Operator Konversi TipeRingkasan, class Matrix9Template
Template FungsiTemplate classSpesialisasi TemplateTemplate VariadikDasar SFINAE & Type TraitsRangkuman, Container GenerikLatihan sendiri: Compiler C++ online