User Tools

Site Tools


cpp:function_templates

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
cpp:function_templates [2019/05/02 14:10] – [Templates Συναρτήσεων] gthanoscpp:function_templates [Unknown date] (current) – external edit (Unknown date) 127.0.0.1
Line 26: Line 26:
  
 Ας προσπαθήσουμε να χρησιμοποιήσουμε την παραπάνω συνάρτηση. Ας προσπαθήσουμε να χρησιμοποιήσουμε την παραπάνω συνάρτηση.
-<code cpp maximum1.cpp>+<code cpp find_max1.cpp>
 template <typename T> template <typename T>
 T& maximum(T& a, T& b) { return (a>b?a:b); } T& maximum(T& a, T& b) { return (a>b?a:b); }
Line 47: Line 47:
 <WRAP tip 80% center round> <WRAP tip 80% center round>
 Μπορείτε να παραλείψετε τον τύπο των παραμέτρων κατά την κλήση της συνάρτησης **maximum** ως εξής: Μπορείτε να παραλείψετε τον τύπο των παραμέτρων κατά την κλήση της συνάρτησης **maximum** ως εξής:
-<code cpp maximum1.cpp>+<code cpp find_max1.cpp>
 template <typename T> template <typename T>
 T& maximum(T& a, T& b) { return (a>b?a:b); } T& maximum(T& a, T& b) { return (a>b?a:b); }
Line 64: Line 64:
 </WRAP> </WRAP>
  
-===== Templates Συναρτήσεων με παραμέτρους κλάσεις =====+===== Templates συναρτήσεων με παραμέτρους σύνθετους τύπους (κλάσεις=====
  
-Ας υποθέσουμε ότι θέλουμε να κάνουμε χρήση της παραπάνω συνάρτηση **maximum** προκειμένου να βρούμε το μέγιστο μεταξύ δύο φοιτητών. Η κλάση του φοιτητή δίνεται παρακάτω:+Ας υποθέσουμε ότι θέλουμε να κάνουμε χρήση της παραπάνω συνάρτηση **maximum** προκειμένου να βρούμε το μέγιστο μεταξύ δύο φοιτητών. Η κλάση //Student// του φοιτητή δίνεται στην προηγούμενη ενότητα:
  
-<code cpp Student.hpp>+Εφόσον προσθέσουμε την παραπάνω συνάρτηση υπεφόρτωσης του τελεστή %%>%% το πρόγραμμα εκτυπώνει τα εξής: 
 +<code cpp find_max2.cpp> 
 +#include <iostream> 
 +#include "Student.hpp
 +using namespace std;
  
-#include<cstring>+template <typename T> 
 +T& maximum(T& a, T& b) { return (a>b?a:b); }
  
-class Student { +int main() { 
-  char *name; + Student george("George", 1234), kate("Kate"4321);
-  int aem; +
-   +
-public: +
-  Student(const char *name, int aem); +
-  Student()+
-  ~Student(); +
-  char *getName() const; +
-  int getAEM() const; +
-  friend std::ostream& operator<<(std::ostream& outconst Student & st)+
-};+
  
-Student::Student(const char *nameint aem+ cout << "max('George','Kate'): " << maximum(georgekate<< endl;
-  this->name = new char [strlen(name) + 1]; +
-  strcpy(this->namename)+
-  this->aem = aem;+
 } }
 +</code>
  
-Student::Student() { +===== Templates συναρτήσεων με αριθμητικές παραμέτρους =====
-  this->name nullptr; +
-  this->aem 0; +
-}+
  
-Student::~Student() { +Ας υποθέσουμε τώρα ότι θέλουμε να βρούμε το μέγιστο μεταξύ περισσότερων των δύο αριθμητικών τιμών οι οποίες έχουν αποθηκευτεί σε ένα πίνακα. Σε αυτή την περίπτωση η συνάρτηση **maximum** θα μπορούσε να γραφεί ως εξής:
-  if(name != nullptr) +
-    delete []name; +
-}+
  
-char* Student::getName() const +<code cpp> 
-  return name+template <typename T, int size> 
-+T& maximum(T a[]) { 
- +  T& max = a[0]
-int Student::getAEM(const { +  for(int i=1; i<size; i++
-  return aem; +    if(a[i]>max
-+      max = a[i]
- +  return max;
-std::ostream& operator<<(std::ostream& out, const Student& st{ +
-  out << st.name << " " << st.aem+
-  return out;+
 } }
 </code> </code>
  
-O κώδικας που κάνει χρήση της παραπάνω κλάσης είναι ο εξής+Παρατηρήστε ότι η συνάρτηση λαμβάνει μία επιπλέον ακέραια τιμή ως παράμετρο που αντιπροσωπεύει το μέγεθος του πίνακα.
- +
-<code cpp maximum2.cpp> +
-template <typename T> +
-T& maximum(T& a, T& b) { return (a>b?a:b); }+
  
 +Ο κώδικας χρήσης της παραπάνω συνάρτησης θα μπορούσε να είναι ο εξής:
 +<code cpp find_max3.cpp>
 #include <iostream> #include <iostream>
 using namespace std; using namespace std;
Line 126: Line 108:
 #include "Student.hpp" #include "Student.hpp"
  
-int main() { +template <typename T, int size>
-  Student george("George", 1234), kate("Kate", 12345);  +
-  cout << "max('George','Kate'): " << maximum(george, kate) << endl; +
-+
-</code> +
- +
-Εάν προσπαθήσουμε να μεταγλωττίσουμε, το πρόγραμμα βγάζει αρκετά μηνύματα λάθους τα οποία συμπυκνώνονται στο ότι ο μεταγλωττιστής δεν ξέρει πως να διαχειριστή την ανισότητα μεταξύ δύο αντικειμένων τύπου //Student//. Για τον λόγο αυτό θα πρέπει να υπερφορτώσουμε τον τελεστή **>** για την κλάση Student ως εξής: +
- +
-<code cpp> +
-// σύγκριση δύο μαθητών με βάση το ΑΕΜ τους +
-bool Student::operator<(const Student& st) const { +
-  if(aem < st.aem) +
-    return true; +
-  return false; +
-+
-</code> +
- +
-Εφόσον προσθέσουμε την παραπάνω συνάρτηση υπεφόρτωσης του τελεστή **>**το πρόγραμμα εκτυπώνει τα εξής: +
-<code> +
-max('George','Kate'): Kate 12345 +
-</code> +
- +
-===== Templates συναρτήσεων με αριθμητικές παραμέτρους ===== +
- +
-Ας υποθέσουμε τώρα ότι θέλουμε να βρούμε το μέγιστο μεταξύ περισσότερων των δύο αριθμητικών τιμών οι οποίες έχουν αποθηκευτεί σε ένα πίνακα. Σε αυτή την περίπτωση η συνάρτηση **maximum** θα μπορούσε να γραφεί ως εξής: +
- +
-template <typename T, int size=3>+
 T& maximum(T a[]) { T& maximum(T a[]) {
   T& max = a[0];   T& max = a[0];
Line 160: Line 116:
   return max;   return max;
 } }
 +
 +int main() {
 +  Student george("George", 1234), kate("Kate", 12345), mary("Mary", 12346);
 +  Student students[] = { george, kate, mary };
 +  cout << "max('George','Kate', 'Mary'): " << maximum<Student,3>(students) << endl;
 +}
 +</code>
  
  
cpp/function_templates.1556806230.txt.gz · Last modified: 2019/05/02 13:10 (external edit)