This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
cpp:vector_overloading_binary_operators [2017/05/05 08:57] gthanos |
cpp:vector_overloading_binary_operators [2021/05/24 06:42] (current) |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ===== Υπερφόρτωση δυαδικών τελεστών | + | ===== Υπερφόρτωση δυαδικών τελεστών |
| - | ^ Τελεστής | + | Ο παρακάτω πίνακας περιγράφει τη λειτουργία της υπερφόρτωσης των τελεστών για το παράδειγμα της κλάσης //Vector// που ακολουθεί. Σε αυτή την ενότητα, |
| - | | %%+%% | // | + | |
| - | | %%-%% | // | + | ^ Τελεστής |
| - | | %%+%% | //Vector// | //int// | Επιστρέφει ένα νέο αντικείμενο τύπου //Vector// που κάθε στοιχείο του προκύπτει από το άθροισμα του αντίστοιχου στοιχείου του //Vector// με τον ακέραιο | | + | | %%+%% | // |
| + | | %%-%% | // | ||
| + | | %%*%% | | ||
| + | | %%+%% | // | ||
| + | | %%+%% | //int// | //Vector// | Επιστρέφει ένα νέο αντικείμενο τύπου //Vector// που κάθε στοιχείο του προκύπτει από το άθροισμα του αντίστοιχου στοιχείου του //Vector// με τον ακέραιο | | ||
| | %%-%% | // | | %%-%% | // | ||
| | %%*%% | // | | %%*%% | // | ||
| + | | %%*%% | // | ||
| | %%/%% | // | | %%/%% | // | ||
| | % | // | | % | // | ||
| + | | %%<< | ||
| + | | %%>> | ||
| + | | %%==%% | ||
| + | | %%!=%% | ||
| + | <WRAP center round info 80%> | ||
| + | Μία φιλική μέθοδος και ένα μέλος της κλάσης δεν είναι δυνατόν να υλοποιούν την ίδια λειτουργικότητα υπερφόρτωσης. Θα πρέπει να επιλέξετε έναν από τους δύο τρόπους για να υλοποιήσετε τη λειτουργία της υπερφόρτωσης. | ||
| + | </ | ||
| - | <color red>*</color> **στο οποίο εφαρμόζεται**. | + | <code cpp Vector.hpp> |
| + | # | ||
| + | #include < | ||
| + | #include < | ||
| + | using namespace std; | ||
| + | #ifndef _VECTOR_HPP_ | ||
| + | #define _VECTOR_HPP_ | ||
| - | <code cpp Vector.cpp> | + | class Vector { |
| + | int *array; | ||
| + | int size; | ||
| + | |||
| + | public: | ||
| + | Vector(int length=0); | ||
| + | Vector(const Vector& v); | ||
| + | Vector(const Vector *v); | ||
| + | ~Vector(); | ||
| + | int length() const; | ||
| + | int & | ||
| + | int find(int a) const; | ||
| + | // if not element not found | ||
| + | |||
| + | void print() const; | ||
| + | void print(string &msg) const; | ||
| + | |||
| + | /* binary operators that don't modify left operand */ | ||
| + | Vector& operator=(const Vector& v); // assignment operator | ||
| + | Vector operator+(const Vector& v) const; | ||
| + | //friend Vector operator+(const Vector& v1, const Vector& v2); // same as above | ||
| + | Vector operator-(const Vector& v) const; | ||
| + | Vector operator*(const Vector& v) const; | ||
| + | friend Vector operator+(const Vector& v, int a); // Returns a new vector. Each element of vector equals the sum of v[i] + a | ||
| + | friend Vector operator+(int a, const Vector& v); // Returns a new vector. Each element of vector equals the sum of v[i] + a | ||
| + | Vector operator-(int a) const; | ||
| + | Vector operator*(int a) const; | ||
| + | friend Vector operator*(int a, const Vector& v); // Returns a new vector. Each element of vector equals the product: | ||
| + | Vector operator/ | ||
| + | Vector operator%(int a) const; | ||
| + | |||
| + | bool operator==(const Vector& v) const; | ||
| + | bool operator!=(const Vector& v) const; | ||
| + | // of right operand. | ||
| + | |||
| + | Vector operator | ||
| + | // | ||
| + | Vector operator >> (int a) const; | ||
| + | //friend Vector operator>>(const Vector& v, int a);// Same as above | ||
| + | }; | ||
| + | |||
| + | #endif | ||
| </ | </ | ||
| - | Από τα παραπάνω παρατηρούμε τα εξής: | + | <code cpp Vector.cpp> |
| + | #include " | ||
| + | Vector:: | ||
| + | size = length; | ||
| + | array = new (nothrow) int[size]; | ||
| + | if(array==NULL) { | ||
| + | cerr << " | ||
| + | exit(-1); | ||
| + | } | ||
| + | for(int i=0; i<size; i++) | ||
| + | array[i] = 0; | ||
| + | } | ||
| + | Vector:: | ||
| + | size = v.length(); | ||
| + | array = new (nothrow) int[size]; | ||
| + | if(array==NULL) { | ||
| + | cerr << " | ||
| + | exit(-1); | ||
| + | } | ||
| + | for(int i=0; i<size; i++) | ||
| + | array[i] = v.valueAt(i); | ||
| + | } | ||
| + | Vector:: | ||
| + | size = v-> | ||
| + | array = new (nothrow) int[size]; | ||
| + | if(array==NULL) { | ||
| + | cerr << " | ||
| + | exit(-1); | ||
| + | } | ||
| + | for(int i=0; i<size; i++) | ||
| + | array[i] = v-> | ||
| + | } | ||
| + | |||
| + | Vector:: | ||
| + | delete [] array; | ||
| + | } | ||
| + | |||
| + | int Vector:: | ||
| + | return size; | ||
| + | } | ||
| + | |||
| + | int & | ||
| + | if(pos> | ||
| + | cerr << " | ||
| + | | ||
| + | } | ||
| + | return array[pos]; | ||
| + | } | ||
| + | |||
| + | int Vector:: | ||
| + | for(int i=0; i<size; i++) | ||
| + | if(array[i] == a) | ||
| + | return i; | ||
| + | return -1; | ||
| + | } | ||
| + | |||
| + | void Vector:: | ||
| + | for(int i=0; i<size; i++) { | ||
| + | cout << array[i]; | ||
| + | if(i==size-1) | ||
| + | cout << endl; | ||
| + | else | ||
| + | cout << ", "; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | void Vector:: | ||
| + | cout << msg; | ||
| + | print(); | ||
| + | } | ||
| + | |||
| + | Vector& Vector:: | ||
| + | if(array!=NULL) | ||
| + | delete [] array; | ||
| + | size = v.length(); | ||
| + | array = new (nothrow) int[size]; | ||
| + | if(array==NULL) { | ||
| + | cerr << " | ||
| + | exit(-1); | ||
| + | } | ||
| + | for(int i=0; i<size; i++) | ||
| + | array[i] = v.valueAt(i); | ||
| + | return *this; | ||
| + | } | ||
| + | |||
| + | Vector Vector:: | ||
| + | int length; | ||
| + | if (size > v.length()) | ||
| + | length = size; | ||
| + | else | ||
| + | length = v.length(); | ||
| + | Vector n(length); | ||
| + | for(int i=0; i< | ||
| + | int sum = 0; | ||
| + | if(i< | ||
| + | sum += array[i]; | ||
| + | if(i< | ||
| + | sum += v.array[i]; | ||
| + | n.array[i] = sum; | ||
| + | } | ||
| + | return n; | ||
| + | } | ||
| + | |||
| + | /* | ||
| + | Vector operator+(const Vector& v1, const Vector v2) { | ||
| + | int length; | ||
| + | if (v1.size > v2.size) | ||
| + | length = v1.length(); | ||
| + | else | ||
| + | length = v2.length(); | ||
| + | Vector n(length); | ||
| + | for(int i=0; i< | ||
| + | int sum = 0; | ||
| + | if(i< | ||
| + | sum += v1.array[i]; | ||
| + | if(i< | ||
| + | sum += v2.array[i]; | ||
| + | n.array[i] = sum; | ||
| + | } | ||
| + | return n; | ||
| + | }*/ | ||
| + | |||
| + | Vector Vector:: | ||
| + | int length; | ||
| + | if (size > v.length()) | ||
| + | length = size; | ||
| + | else | ||
| + | length = v.length(); | ||
| + | Vector n(length); | ||
| + | for(int i=0; i< | ||
| + | int sum = 0; | ||
| + | if(i< | ||
| + | sum += array[i]; | ||
| + | if(i< | ||
| + | sum -= v.array[i]; | ||
| + | n.array[i] = sum; | ||
| + | } | ||
| + | return n; | ||
| + | } | ||
| + | |||
| + | Vector Vector:: | ||
| + | int length; | ||
| + | if (size < v.size) | ||
| + | length = size; | ||
| + | else | ||
| + | length = v.size; | ||
| + | Vector n(length); | ||
| + | for(int i=0; i< | ||
| + | n.array[i] = array[i] * v.array[i]; | ||
| + | return n; | ||
| + | } | ||
| + | |||
| + | Vector operator+(const Vector& v, int a) { | ||
| + | Vector n(v.size); | ||
| + | for(int i=0; i< | ||
| + | n.array[i] = v.array[i] + a; | ||
| + | return n; | ||
| + | } | ||
| + | |||
| + | Vector operator+(int a, const Vector& v) { | ||
| + | Vector n(v); | ||
| + | for(int i=0; i< | ||
| + | n.array[i] += a; | ||
| + | } | ||
| + | return n; | ||
| + | } | ||
| + | |||
| + | Vector Vector:: | ||
| + | Vector n(size); | ||
| + | for(int i=0; i<size; i++) | ||
| + | n.array[i] = array[i] - a; | ||
| + | return n; | ||
| + | } | ||
| + | |||
| + | Vector Vector:: | ||
| + | Vector n(size); | ||
| + | for(int i=0; i<size; i++) | ||
| + | n.array[i] = array[i] * a; | ||
| + | return n; | ||
| + | } | ||
| + | |||
| + | Vector operator*(int a, const Vector& v) { | ||
| + | Vector n(v); | ||
| + | for(int i=0; i< | ||
| + | n.array[i] *= a; | ||
| + | } | ||
| + | return n; | ||
| + | } | ||
| + | |||
| + | Vector Vector:: | ||
| + | Vector n(size); | ||
| + | for(int i=0; i<size; i++) | ||
| + | n.array[i] = array[i] / a; | ||
| + | return n; | ||
| + | } | ||
| + | |||
| + | Vector Vector:: | ||
| + | Vector n(size); | ||
| + | for(int i=0; i<size; i++) | ||
| + | n.array[i] = array[i] % a; | ||
| + | return n; | ||
| + | } | ||
| + | |||
| + | bool Vector:: | ||
| + | if( size != v.size ) | ||
| + | return false; | ||
| + | for(int i=0; i<size; i++) | ||
| + | if( array[i] != v.array[i] ) | ||
| + | return false; | ||
| + | return true; | ||
| + | } | ||
| + | |||
| + | bool Vector:: | ||
| + | return !(*this == v); | ||
| + | } | ||
| + | |||
| + | /* | ||
| + | Vector operator<< | ||
| + | Vector n(v); | ||
| + | for(int i=0; i< | ||
| + | n.array[i] <<= a; | ||
| + | return n; | ||
| + | }*/ | ||
| + | |||
| + | Vector Vector:: | ||
| + | Vector n(*this); | ||
| + | for(int i=0; i< | ||
| + | n.array[i] <<= a; | ||
| + | return n; | ||
| + | } | ||
| + | |||
| + | /*Vector operator>> | ||
| + | Vector n(v); | ||
| + | for(int i=0; i< | ||
| + | n.array[i] >>= a; | ||
| + | return n; | ||
| + | }*/ | ||
| + | |||
| + | Vector Vector:: | ||
| + | Vector n(*this); | ||
| + | for(int i=0; i< | ||
| + | n.array[i] >>= a; | ||
| + | return n; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <code cpp VectorUsage.cpp> | ||
| + | #include " | ||
| + | |||
| + | int main() { | ||
| + | Vector v(5); | ||
| + | v.valueAt(0) = 2; v.valueAt(1) = 3; | ||
| + | v.valueAt(2) = 4; v.valueAt(3) = 5; v.valueAt(4) = 6; | ||
| + | | ||
| + | string msg = " | ||
| + | v.print(msg); | ||
| + | | ||
| + | Vector f = v; | ||
| + | v.print(msg=" | ||
| + | if( f == v ) | ||
| + | cout << "f == v " << endl; | ||
| + | else | ||
| + | cout << "f != v " << endl; | ||
| + | | ||
| + | | ||
| + | Vector k; | ||
| + | k = f + v; | ||
| + | k.print(msg=" | ||
| + | k = f - v; | ||
| + | k.print(msg=" | ||
| + | k = f * v; | ||
| + | k.print(msg=" | ||
| + | k = f + 2; | ||
| + | k.print(msg=" | ||
| + | k = 2 + f; | ||
| + | k.print(msg=" | ||
| + | k = f - 2; | ||
| + | k.print(msg=" | ||
| + | k = f * 2; | ||
| + | k.print(msg=" | ||
| + | k = f / 2; | ||
| + | k.print(msg=" | ||
| + | k = f % 2; | ||
| + | k.print(msg=" | ||
| + | f = f << 2; | ||
| + | f.print(msg=" | ||
| + | f = f >> 2; | ||
| + | f.print(msg=" | ||
| + | if( f == v ) | ||
| + | cout << "f == v " << endl; | ||
| + | else | ||
| + | cout << "f != v " << endl; | ||
| + | } | ||
| + | </ | ||