Εισαγωγή Δεδομένων σε Κλάση

Επικοινωνία με την κλάση

Για να καλέσουμε μία συνάρτηση-μέλος από το κυρίως πρόβλημα, χρησιμοποιούμε την αναφορά στο αντικείμενο:

<όνομα αντικειμένου>.<όνομα συνάρτησης-μέλους>

Παράδειγμα:

#include <iostream.h>
using namespace std;
class Cat
{
public:
 int itsAge;
 int itsWeight;
};
void main()
{
 Cat Frisky;
 Frisky.itsAge = 5;
 cout << "Frisky is a cat who is " ;
 cout << Frisky.itsAge << " years old.\n";
}

Στο παραδειγμα αυτο, δημιουργούμε ένα αντικείμενο Frisky της κλάσης Cat και προσπελαύνουμε το μέλος itsAge μέσω του τελεστή ..

Πρόσβαση σε στοιχεία κλάσης

  • Εάν δεν διευκρινιστεί ο τύπος των δεδομένων στην κλάση, ο εξ' ορισμού τύπος είναι private.
  • Στα private δεδομένα δεν μπορούμε να έχουμε πρόσβαση εκτός κλάσης. Αυτό συμβαίνει για την ασφάλεια των δεδομένων.
  • Για το λόγο αυτό, πρέπει να δημιουργήσουμε κατάλληλες συναρτήσεις για εργασίες όπως:
    • Απόδοση τιμής σε μεταβλητή
    • Επιστροφή δεδομένων

Τελεστής Εμβέλειας ::

Όταν δηλώνουμε πρότυπο συνάρτησης μέσα σε μία κλάση και θέλουμε να ορίσουμε τη συνάρτηση εκτός κλάσης, πρέπει να χρησιμοποιήσουμε τον Τελεστή Εμβέλειας ::.

Παράδειγμα:

class foo {
...
 int sum(void);
};
int foo::sum(void) {
 int sum=0;
 for (int i=0;i<foo::i;i++) {
 sum += a[i];
 }
 return(sum);
}

Στο παραδειγμα αυτό, η συνάρτηση sum δηλώνεται μέσα στην κλάση foo αλλά ορίζεται εκτός της κλάσης, χρησιμοποιώντας τον τελεστή εμβέλειας ::.

Απόδοση τιμής σε μεταβλητή

Υπάρχουν συναρτήσεις που χρησιμοποιούνται για να αποδώσουν τιμή σε private μεταβλητή μιας κλάσης. Συνήθως ονομάζονται Set_<όνομα μεταβλητής>.

Παράδειγμα:

class Cat {
public:
 void SetAge (int age);
 void Meow();
private:
 int itsAge;
};
…
void Cat::SetAge(int age) {
 itsAge = age;
}
…

Η συνάρτηση SetAge χρησιμοποιείται για να ορίσει την τιμή της private μεταβλητής itsAge.

Επιστροφή δεδομένων

Υπάρχουν συναρτήσεις που χρησιμοποιούνται για να μεταφέρουν μια private μεταβλητή εκτός κλάσης. Συνήθως ονομάζονται Get_<όνομα μεταβλητής>.

Παράδειγμα:

class Cat {
public:
 void SetAge (int age);
 int GetAge();
 void Meow();
private:
 int itsAge;
};
…
int Cat::GetAge() {
 return itsAge;
}
…

Η συνάρτηση GetAge χρησιμοποιείται για να επιστρέψει την τιμή της private μεταβλητής itsAge.

Πλήρες Παράδειγμα Προγράμματος

#include <iostream>
using namespace std;
class Cat {
public:
 int GetAge();
 void SetAge (int age);
 void Meow();
private:
 int itsAge;
};

int Cat::GetAge() {
 return itsAge;
}
void Cat::SetAge(int age) {
 itsAge = age;
}
void Cat::Meow() {
 cout << "Meow.\n";
}

int main() {
 Cat Frisky;
 Frisky.SetAge(5);
 Frisky.Meow();
 cout << "Frisky is a cat who is " ;
 cout << Frisky.GetAge() << " years old.\n";
 Frisky.Meow();
 return 0;
}

Έξοδος:

Meow.
Frisky is a cat who is 5 years old.
Meow.

Αρχικοποίηση κλάσης (Constructors)

Οι classes περιλαμβάνουν μια ιδιαίτερη συνάρτηση-μέλος που ονομάζεται constructor (δομητής).

  • Ο constructor έχει το ίδιο όνομα με την κλάση.
  • Μπορεί να παίρνει παράμετρο αν χρειάζεται αλλά δεν έχει τύπο επιστροφής, ούτε καν void.

Παράδειγμα:

class Date {
public:
 Date(int d, int m, int y);
 // . . .
};
Date::Date(int d, int m, int y) : day(d), month(m), year(y) {
}

Μεγάλο πλεονέκτημα των ΔΟΜΗΤΩΝ είναι το ότι η ύπαρξή τους απομακρύνει την πιθανότητα μη αρχικοποιημένων μεταβλητών. Αν έχει δηλωθεί η Date(int, int, int) τότε η Date d; είναι λάθος.

Στις κλάσεις μπορεί να ορίζονται περισσότεροι από ένας δομητές αλλά μόνο ένας από αυτούς θα είναι ο προκαθορισμένος (default).

class Date {
public:
 Date();
 Date(int d, int m, int y);
 Date(String);
 . . .
};
Date::Date(int d, int m, int y) : day(d), month(m), year(y) {
 if (year == 0) year = current year;
}

Destructor (αποδομητής)

Όταν δημιουργούμε ένα constructor, δημιουργούμε και ένα Destructor (αποδομητής).

  • Δεν έχει παραμέτρους και δεν επιστρέφει τίποτα.
  • Πρέπει να αποδεσμεύσει τη δεσμευμένη μνήμη (memory) και να καθαρίσει την κλάση.
  • Ο destructor έχει τη μορφή: ~ClassName() {…}

Παραδείγματα

Παράδειγμα 1

#include <iostream>
using namespace std;
class Rectangle {
 int width, height;
public:
 void set_values (int,int);
 int area() {return width*height;}
};
void Rectangle::set_values (int x, int y) {
 width = x;
 height = y;
}
int main () {
 Rectangle rect;
 rect.set_values (3,4);
 cout << "area: " << rect.area();
 return 0;
}

Παράδειγμα 2

#include <iostream>
using namespace std;
class Rectangle {
 int width, height;
public:
 void set_values (int,int);
 int area () {return width*height;}
};
void Rectangle::set_values (int x, int y) {
 width = x;
 height = y;
}
int main () {
 Rectangle rect, rectb;
 rect.set_values (3,4);
 rectb.set_values (5,6);
 cout << "rect area: " << rect.area() << endl;
 cout << "rectb area: " << rectb.area() << endl;
 return 0;
}

Παράδειγμα 3

#include <iostream>
using namespace std;
class Rectangle {
 int width, height;
public:
 Rectangle (int,int);
 int area () {return (width*height);}
};
Rectangle::Rectangle (int a, int b) {
 width = a;
 height = b;
}
int main () {
 Rectangle rect (3,4);
 Rectangle rectb (5,6);
 cout << "rect area: " << rect.area() << endl;
 cout << "rectb area: " << rectb.area() << endl;
 return 0;
}