User Tools

Site Tools


cpp:class_templates

This is an old revision of the document!


Templates κλάσεων

Σε αναλογία με τα templates συναρτήσεων μπορούμε να κατασκευάσουμε κλάσεις που να λαμβάνουν ως παράμετρο ένα ή περισσότερους τύπους δεδομένων. Στο παρακάτω παράδειγμα, έχουμε την κλάση Box<T> η οποία είναι παραμετρική.

Box.hpp
template <typename T>
class Box {
  T e;
public:
  Box(T e);
  T get() const;
  void set(T e);
  template <typename U>
  friend std::ostream& operator<<(std::ostream& out, const Box<U>& t);
};
 
template <typename T>
Box<T>::Box(T e) {
  this->e = e;
}
 
template <typename T>
T Box<T>::get() const { return e; }
 
template <typename T>
void Box<T>::set(T e) { this->e = e; }
 
template <typename T>
std::ostream& operator<<(std::ostream& out, const Box<T>& t) {
  out << t.get();
  return out;
}

H παραπάνω κλάση μπορεί να παράγει διαφορετικούς τύπους δεδομένων, ανάλογα με τον τύπο T. Στο παρακάτω παράδειγμα έχουμε ένα μία κλάση Box<int>, μία κλάση Box<double> και μία κλάση Box<Student>.

BoxUsage.cpp
#include <iostream>
#include "Box.hpp"
#include "Student.hpp"
 
using namespace std;
 
int main() {
 
  Box<int> b(15);
  Box<double> d(4.23);
  Student kate = {"Kate", 1234};
  Box<Student> studentBox(kate);
  Student katherine = studentBox.get();
  katherine.setName("Katherine");
 
  cout << kate << endl;
  cout << katherine << endl;
  cout << studentBox.get() << endl;
}

Ένα πιο σύνθετο παράδειγμα

Ας υποθέσουμε ότι θέλουμε να κατασκευάσουμε ένα στατικό πίνακα (συγκεκριμένης χωρητικότητας) για την αποθήκευση πληροφορίας. Σε αναλογία με την κλάση Box<Τ> θέλουμε να φτιάξουμε ένα πίνακα στον οποίο να μπορούμε να αποθηκεύσουμε διαφορετικούς τύπους δεδομένων.

cpp/class_templates.1556943928.txt.gz · Last modified: 2019/05/04 03:25 (external edit)