Menu
CoddyTech

Template class

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

Sama seperti templat fungsi yang memungkinkan kamu menulis fungsi yang tidak bergantung pada tipe, templat class memungkinkan kamu membuat class yang tidak bergantung pada tipe. Beginilah cara container seperti std::vector bekerja: kamu mendefinisikan strukturnya sekali, lalu compiler membuat 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
}

Biasanya, kamu menentukan tipe di dalam tanda kurung sudut saat membuat objek dari templat class. Sejak C++17, compiler juga dapat menyimpulkan tipe tersebut dari argumen konstruktor (Box b(42); membuat Box<int>), tetapi jika tidak ada argumen untuk menyimpulkan tipe, kamu harus menuliskannya. Compiler kemudian menghasilkan definisi class lengkap untuk tipe 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 berfungsi dengan tipe apa pun.

challenge icon

Tantangan

Mudah

Mari kita buat sistem penyimpanan generik menggunakan templat class untuk membuat wadah fleksibel yang dapat menyimpan tipe data apa pun. Kamu akan mengatur class templat dalam file header dan menunjukkan fleksibilitasnya dengan berbagai tipe dalam program utama.

Kamu akan membuat dua file:

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

    Templat Storage-mu harus memiliki:

    • Anggota privat untuk menyimpan nilai
    • Konstruktor 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 hasil konstruksi default dari tipe T, false jika tidak

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

    • Anggota privat untuk nilai pertama dan kedua, yang bisa memiliki tipe berbeda
    • Konstruktor 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 templatmu dengan:

    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 dan 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 bagaimana templat Storage yang sama dapat digunakan dengan mudah untuk integer dan string, serta bagaimana Pair dapat menggabungkan berbagai tipe. Compiler menghasilkan definisi class terpisah untuk setiap kombinasi tipe yang kamu gunakan. Ingat, gunakan sintaks template <typename T> untuk templat dengan satu tipe dan template <typename T, typename U> untuk templat 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 tampilkan: Int storage: <value>
    
    // TODO: Perbarui dengan bilangan bulat kedua menggunakan setValue(), lalu tampilkan: Updated: <value>
    
    // TODO: Buat Storage<std::string> dengan input string, lalu tampilkan: String storage: <value>
    
    // TODO: Periksa apakah penyimpanan string kosong, lalu tampilkan: 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