Menu
CoddyTech

Template class

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

Sama seperti template fungsi memungkinkan kamu menulis fungsi yang tidak bergantung pada tipe, template class memungkinkan kamu membuat class yang tidak bergantung pada tipe. Begitulah cara container seperti std::vector bekerja: kamu mendefinisikan strukturnya sekali, lalu compiler menghasilkan versi khusus untuk setiap tipe yang kamu gunakan.

template <typename T>
class Box {
    T value;
public:
    Box(T v) : value(v) {}
    T getValue() const { return value; }
    void setValue(T v) { value = v; }
};

int main() {
    Box<int> intBox(42);
    Box<std::string> strBox("Hello");
    
    std::cout << intBox.getValue() << std::endl;  // 42
    std::cout << strBox.getValue() << std::endl;  // Hello
}

Berbeda dengan template fungsi, kamu harus menentukan tipe secara eksplisit saat membuat object dari template class menggunakan tanda kurung sudut. Kompiler kemudian menghasilkan definisi class lengkap untuk tipe tertentu tersebut.

Template class dapat memiliki beberapa parameter tipe dan bahkan parameter non-tipe seperti bilangan bulat:

template <typename T, int Size>
class FixedArray {
    T data[Size];
public:
    T& operator[](int index) { return data[index]; }
    int size() const { return Size; }
};

FixedArray<double, 5> arr;  // array berisi 5 nilai double
arr[0] = 3.14;

Saat mendefinisikan fungsi anggota di luar class, kamu harus mengulang deklarasi template:

template <typename T>
class Container {
    T* data;
public:
    Container();
    ~Container();
};

template <typename T>
Container<T>::Container() : data(nullptr) {}

template <typename T>
Container<T>::~Container() { delete data; }

Template class menjadi dasar pemrograman generik di C++, sehingga kamu dapat menulis struktur data yang dapat digunakan kembali dan bekerja dengan tipe apa pun.

challenge icon

Tantangan

Mudah

Mari buat sistem penyimpanan generik menggunakan template class untuk membuat container fleksibel yang dapat menampung tipe data apa pun. Kamu akan mengatur template class di dalam file header dan menunjukkan fleksibilitasnya dengan berbagai tipe di program utama.

Kamu akan membuat dua file:

  • Storage.h: Definisikan template class bernama Storage yang berfungsi sebagai container sederhana untuk satu nilai dengan beberapa operasi berguna:

    Template Storage-mu harus memiliki:

    • Anggota privat untuk menyimpan nilai
    • Constructor yang menerima nilai awal
    • Method getValue() yang mengembalikan nilai yang disimpan
    • Method setValue() yang memperbarui nilai yang disimpan
    • Method isEmpty() yang mengembalikan true jika nilai sama dengan nilai default hasil konstruksi dari tipe T, dan false jika tidak

    Buat juga template class bernama Pair dengan dua parameter tipe yang menyimpan dua nilai terkait:

    • Anggota privat untuk nilai pertama dan kedua, yang tipenya mungkin berbeda
    • Constructor yang menginisialisasi kedua nilai
    • Method getFirst() dan getSecond() untuk mengambil setiap nilai
    • Method display() yang mencetak: (<first>, <second>)
  • main.cpp: Baca empat input, masing-masing pada baris terpisah:
    1. Nilai integer
    2. Nilai integer baru
    3. Nilai string
    4. Nilai double

    Tunjukkan penggunaan template-mu dengan cara:

    1. Membuat Storage<int> dengan integer pertama, lalu mencetak: Int storage: <value>
    2. Memperbaruinya dengan integer kedua menggunakan setValue(), lalu mencetak: Updated: <value>
    3. Membuat Storage<std::string> dengan input string, lalu mencetak: String storage: <value>
    4. Memeriksa apakah storage string kosong, lalu mencetak: Is empty: <true/false> (cetak true atau false)
    5. Membuat Pair<std::string, double> dengan nilai string dan double, lalu memanggil display()
    6. Membuat Pair<int, int> dengan kedua input integer, lalu memanggil display()

Sebagai contoh, dengan input 42, 100, Hello, dan 3.14:

Int storage: 42
Updated: 100
String storage: Hello
Is empty: false
(Hello, 3.14)
(42, 100)

Perhatikan bahwa template Storage yang sama dapat digunakan dengan mudah untuk integer dan string, dan Pair dapat menggabungkan berbagai tipe. Compiler menghasilkan definisi class terpisah untuk setiap kombinasi tipe yang kamu gunakan. Ingat untuk menggunakan sintaks template <typename T> untuk template dengan satu tipe dan template <typename T, typename U> untuk template dengan beberapa parameter tipe.

Coba sendiri

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

using namespace std;

int main() {
    // Baca input
    int intValue1;
    int intValue2;
    string strValue;
    double doubleValue;
    
    cin >> intValue1;
    cin >> intValue2;
    cin >> strValue;
    cin >> doubleValue;
    
    // TODO: Buat Storage<int> dengan bilangan bulat pertama, lalu cetak: Int storage: <value>
    
    // TODO: Perbarui dengan bilangan bulat kedua menggunakan setValue(), lalu cetak: Updated: <value>
    
    // TODO: Buat Storage<std::string> dengan input string, lalu cetak: String storage: <value>
    
    // TODO: Periksa apakah penyimpanan string kosong, lalu cetak: Is empty: true/false
    
    // TODO: Buat Pair<std::string, double> dengan string dan double, lalu panggil display()
    
    // TODO: Buat Pair<int, int> dengan kedua bilangan bulat, lalu panggil display()
    
    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