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.
Tantangan
MudahMari 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 bernamaStorageyang 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 mengembalikantruejika nilai sama dengan nilai default hasil konstruksi dari tipe T, danfalsejika tidak
Buat juga template class bernama
Pairdengan 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()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 template-mu dengan cara:
- 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, lalu 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 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;
}
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