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/12 06:39] gthanos |
cpp:vector_overloading_binary_operators [2021/05/24 06:42] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ===== Υπερφόρτωση δυαδικών τελεστών που μπορούν να υλοποιηθούν ως μέλη της κλάσης ή ως φιλικές συναρτήσεις ===== | ||
| - | |||
| - | Παρακάτω θα δούμε την υπερφόρτωση τελεστών που δεν μεταβάλλουν τον αριστερό τελεστέο. Οι τελεστές περιγράφονται στον παρακάτω πίνακα. | ||
| - | |||
| - | ^ Τελεστής | ||
| - | | %%+%% | // | ||
| - | | %%-%% | // | ||
| - | | %%*%% | // | ||
| - | | %%+%% | // | ||
| - | | %%+%% | // | ||
| - | | %%-%% | // | ||
| - | | %%*%% | // | ||
| - | | %%*%% | // | ||
| - | | %%/%% | // | ||
| - | | % | // | ||
| - | | %%<< | ||
| - | | %%>> | ||
| - | | %%==%% | ||
| - | | %%!=%% | ||
| - | |||
| - | <WRAP center round info 80%> | ||
| - | Μία φιλική μέθοδο και ένα μέλος της κλάσης δεν είναι δυνατόν να υλοποιούν την ίδια λειτουργικότητα υπερφόρτωσης. Θα πρέπει να επιλέξετε έναν από τους δύο τρόπους για να υλοποιήσετε τη λειτουργία της υπερφόρτωσης. | ||
| - | </ | ||
| - | |||
| - | <code cpp Vector.cpp> | ||
| - | #include < | ||
| - | #include < | ||
| - | #include < | ||
| - | using namespace std; | ||
| - | |||
| - | class Vector { | ||
| - | int *array; | ||
| - | unsigned int size; | ||
| - | | ||
| - | public: | ||
| - | Vector(unsigned int length=0); | ||
| - | Vector(const Vector &v); | ||
| - | Vector(const Vector *v); | ||
| - | ~Vector(); | ||
| - | unsigned 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 */ | ||
| - | void operator=(const Vector &v); | ||
| - | Vector operator+(const Vector &v) const; | ||
| - | //friend Vector operator+(const Vector &v1, const Vector v2); | ||
| - | Vector operator-(const Vector &v) const; | ||
| - | Vector operator*(Vector &v) const; | ||
| - | Vector operator+(int a) const; | ||
| - | friend Vector operator+(int a, const Vector &v); | ||
| - | Vector operator-(int a) const; | ||
| - | Vector operator*(int a) const; | ||
| - | friend Vector operator*(int a, const Vector &v); | ||
| - | Vector operator/ | ||
| - | Vector operator%(int a) const; | ||
| - | | ||
| - | bool operator==(const Vector &v) const; | ||
| - | bool operator!=(const Vector &v) const; | ||
| - | | ||
| - | Vector operator << (int a) const; | ||
| - | //friend Vector operator<< | ||
| - | Vector operator >> (int a) const; | ||
| - | //friend Vector operator>> | ||
| - | | ||
| - | }; | ||
| - | |||
| - | 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; | ||
| - | } | ||
| - | |||
| - | unsigned 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; | ||
| - | for(int i=0; i<size; i++) { | ||
| - | cout << array[i]; | ||
| - | if(i==size-1) | ||
| - | cout << endl; | ||
| - | else | ||
| - | cout << ", "; | ||
| - | } | ||
| - | } | ||
| - | |||
| - | void 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); | ||
| - | } | ||
| - | |||
| - | 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:: | ||
| - | Vector n(size); | ||
| - | for(int i=0; i<size; i++) | ||
| - | n.array[i] = array[i] * v.array[i]; | ||
| - | 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; | ||
| - | } | ||
| - | |||
| - | 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); | ||
| - | int *array_new = new (nothrow) int [n.size+1]; | ||
| - | if(array_new==NULL) { | ||
| - | cerr << " | ||
| - | exit(-1); | ||
| - | } | ||
| - | for(int i=0; i< | ||
| - | array_new[i] = n.array[i]; | ||
| - | array_new[n.size] = a; | ||
| - | n.size++; | ||
| - | delete [] n.array; | ||
| - | n.array = array_new; | ||
| - | return n; | ||
| - | }*/ | ||
| - | |||
| - | Vector Vector:: | ||
| - | Vector n(*this); | ||
| - | int *array_new = new (nothrow) int [n.size+1]; | ||
| - | if(array_new==NULL) { | ||
| - | cerr << " | ||
| - | exit(-1); | ||
| - | } | ||
| - | for(int i=0; i< | ||
| - | array_new[i] = n.array[i]; | ||
| - | array_new[n.size] = a; | ||
| - | n.size++; | ||
| - | delete [] n.array; | ||
| - | n.array = array_new; | ||
| - | return n; | ||
| - | } | ||
| - | |||
| - | /*Vector operator>> | ||
| - | int pos = v.find(a); | ||
| - | if(pos< | ||
| - | return v; | ||
| - | Vector n(v); | ||
| - | int *array_new = new (nothrow) int [n.size-1]; | ||
| - | if(array_new==NULL) { | ||
| - | cerr << " | ||
| - | exit(-1); | ||
| - | } | ||
| - | for(int i=0; i< | ||
| - | if(i< | ||
| - | array_new[i] = n.array[i]; | ||
| - | if(i==pos) | ||
| - | continue; | ||
| - | if(i> | ||
| - | array_new[i-1] = n.array[i]; | ||
| - | } | ||
| - | n.size--; | ||
| - | delete [] n.array; | ||
| - | n.array = array_new; | ||
| - | return n; | ||
| - | }*/ | ||
| - | |||
| - | Vector Vector:: | ||
| - | int pos = find(a); | ||
| - | if(pos< | ||
| - | return *this; | ||
| - | Vector n(*this); | ||
| - | int *array_new = new (nothrow) int [n.size-1]; | ||
| - | if(array_new==NULL) { | ||
| - | cerr << " | ||
| - | exit(-1); | ||
| - | } | ||
| - | for(int i=0; i< | ||
| - | if(i< | ||
| - | array_new[i] = n.array[i]; | ||
| - | if(i==pos) | ||
| - | continue; | ||
| - | if(i> | ||
| - | array_new[i-1] = n.array[i]; | ||
| - | } | ||
| - | n.size--; | ||
| - | delete [] n.array; | ||
| - | n.array = array_new; | ||
| - | return n; | ||
| - | } | ||
| - | |||
| - | |||
| - | 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 = 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 << 7; | ||
| - | f.print(msg=" | ||
| - | f = f << 7; | ||
| - | f.print(msg=" | ||
| - | f = f >> 6; | ||
| - | f.print(msg=" | ||
| - | f = f >> 6; | ||
| - | f.print(msg=" | ||
| - | if( f == v ) | ||
| - | cout << "f == v " << endl; | ||
| - | else | ||
| - | cout << "f != v " << endl; | ||
| - | } | ||
| - | </ | ||