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.
Tantangan
MudahMari 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 bernamaStorageyang 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 mengembalikantruejika nilai sama dengan nilai hasil konstruksi default dari tipe T,falsejika tidak
Buat juga templat class bernama
Pairdengan 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()dangetSecond()untuk mengambil setiap nilai - Method
display()yang mencetak:(<first>, <second>)
main.cpp: Baca empat input, masing-masing pada baris terpisah:- Nilai integer
- Nilai integer baru
- Nilai string
- Nilai double
Tunjukkan penggunaan templatmu dengan:
- Membuat
Storage<int>dengan integer pertama, lalu mencetak:Int storage: <value> - Memperbaruinya dengan integer kedua menggunakan
setValue(), lalu mencetak:Updated: <value> - Membuat
Storage<std::string>dengan input string, lalu mencetak:String storage: <value> - Memeriksa apakah storage string kosong dan mencetak:
Is empty: <true/false>(cetaktrueataufalse) - Membuat
Pair<std::string, double>dengan nilai string dan double, lalu memanggildisplay() - Membuat
Pair<int, int>dengan kedua input integer, lalu memanggildisplay()
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;
}
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