Menguasai Template Kelas C++: Panduan Praktis
Menguasai Template Kelas C++: Panduan Praktis
Pelajari cara memanfaatkan template kelas C++ untuk menulis kode yang fleksibel dan type-agnostic dengan contoh dunia nyata yang jelas.
Template adalah sumbu utama pemrograman generik dalam C++. Mereka memungkinkan Anda membuat komponen yang dapat digunakan kembali yang bekerja dengan setiap tipe data, meningkatkan kejelasan kode dan mengurangi duplikasi. C++ menawarkan dua jenis template: template fungsi dan template kelas.
- Template Fungsi
- Template Kelas
Template kelas memungkinkan Anda untuk mendefinisikan satu kelas yang menyesuaikan diri dengan berbagai tipe data. Ini tidak hanya mempersingkat kode Anda tetapi juga membuatnya lebih mudah untuk dipelihara.
Mendeklarasikan Template Kelas
Template kelas dimulai dengan kata kunci template, diikuti oleh daftar parameter template yang diapit dengan tanda kurung sudut. Setelah itu datang definisi kelas sebenarnya.
template <class T> class MyClass { private: T var; public: T getVar() const; };
Di sini, T adalah penampung untuk tipe data yang akan disediakan saat template diinstantiasi. Kata kunci class dapat diganti dengan typename tanpa mengubah semantik.
Menginstantiasi Template Kelas
Setelah template didefinisikan, Anda dapat membuat objek dengan menentukan tipe yang diinginkan:
MyClass<int> intObj; MyClass<float> floatObj; MyClass<std::string> stringObj;
Setiap instantiasi menghasilkan kelas konkret yang disesuaikan dengan tipe yang ditentukan selama kompilasi.
Contoh 1: Pembungkus Angka Generik
#include <iostream> using namespace std; // Template kelas yang menyimpan satu nilai dari setiap tipe template <class T> class Number { private: T value; public: Number(T v) : value(v) {} T getValue() const { return value; } }; int main() { Number<int> intNum(7); Number<double> doubleNum(7.7); cout << "Angka int = " << intNum.getValue() << endl; cout << "Angka double = " << doubleNum.getValue() << endl; return 0; }
Output
Angka int = 7 Angka double = 7.7
Perhatikan bahwa parameter template T digunakan untuk variabel anggota, argumen konstruktor, dan tipe pengembalian, yang memungkinkan kelas untuk bekerja dengan setiap tipe.
Mendefinisikan Anggota di Luar Kelas
Ketika fungsi anggota cukup besar atau dibagikan di seluruh spesialisasi, Anda dapat mendefinisikannya di luar tubuh kelas:
template <class T> class Sample { public: T identity(); }; // Definisi di luar template <class T> T Sample<T>::identity() { return static_cast<T>(1); }
Perhatikan pengulangan deklarasi template<class T> sebelum definisi di luar kelas.
Contoh 2: Kalkulator Menggunakan Template Kelas
#include <iostream> using namespace std; template <class T> class Calculator { private: T a, b; public: Calculator(T x, T y) : a(x), b(y) {} T add() const { return a + b; } T subtract() const { return a - b; } T multiply() const { return a * b; } T divide() const { return a / b; } void display() const { cout << "a: " << a << ", b: " << b << endl; cout << "a + b = " << add() << endl; cout << "a - b = " << subtract() << endl; cout << "a * b = " << multiply() << endl; cout << "a / b = " << divide() << endl; } }; int main() { Calculator<int> intCalc(2, 1); Calculator<float> floatCalc(2.4f, 1.2f); cout << "Hasil int:\n"; intCalc.display(); cout << "\nHasil float:\n"; floatCalc.display(); return 0; }
Output
Hasil int: a: 2, b: 1 a + b = 3 a - b = 1 a * b = 2 a / b = 2 Hasil float: a: 2.4, b: 1.2 a + b = 3.6 a - b = 1.2 a * b = 2.88 a / b = 2
Template dengan Beberapa Parameter
Template kelas dapat menerima lebih dari satu parameter, dan Anda bahkan dapat menyediakan tipe default:
template <class T, class U, class V = int> class MultiParam { T first; U second; V third; };
Contoh 3: Template Multi-Parameter
#include <iostream> using namespace std; template <class T, class U, class V = char> class ClassTemplate { private: T var1; U var2; V var3; public: ClassTemplate(T v1, U v2, V v3) : var1(v1), var2(v2), var3(v3) {} void print() const { cout << "var1 = " << var1 << endl; cout << "var2 = " << var2 << endl; cout << "var3 = " << var3 << endl; } }; int main() { ClassTemplate<int, double> obj1(7, 7.7, 'c'); cout << "Nilai obj1:\n"; obj1.print(); ClassTemplate<double, char, bool> obj2(8.8, 'a', false); cout << "\nNilai obj2:\n"; obj2.print(); return 0; }
Output
Nilai obj1: var1 = 7 var2 = 7.7 var3 = c Nilai obj2: var1 = 8.8 var2 = a var3 = 0
Dalam contoh ini, parameter template ketiga default ke char, tetapi dapat diganti seperti yang ditunjukkan dengan bool di obj2.