operator overloading for Array class
c++, overloading
Solution
You have to reserve memory for `ptr` in the constructor.
Array::Array (int size ){ //default constructor
size = (size > 0 ? size : 10);
ptr = new int [size]; // ADD THIS LINE
for (int i = 0; i < size; i++)
ptr[ i ] = 0; //initial values
}
There are some other problems with your code that are not the direct source of the crash but are worth noting:
`Array::operator !=` is defined in terms of itself. It should be similar to `operator==`, or you can re-use it with
if( *this == right )
return false;
return true;
`Array::operator []` should probably throw an exception if the index is out of bounds. Currently it just returns garbage memory.
Inside `Array::Array (int size )` the assignment to `size` assigns to the parameter, not to the member. Change the first line to:
this->size = (size > 0 ? size : 10);
`operator<<` and `operator>>` should return `output` and `input`, respectively.
ostream & operator << ( ostream & output, const Array & array){
for (int i = 0; i < array.size; i++)
output << array.ptr[i] ;
return output;
}
Problem
i am trying to overload operators << >> != == = and [] for Array class. The app crashes on run, though no compilation errors are shown. what could possibly be wrong? IDE used dev c++ Here's array.h ``` #ifndef ARRAY_H #define ARRAY_H #include <iostream> using namespace std; class Array{ friend ostream & operator << ( ostream &, const Array & ); friend istream & operator >> ( istream &, Array &); private: int size; int * ptr; public: Array ( int = 10 ); Array ( const Array & ); //copy constructor ~Array (); const Array &operator=( const Array & ); bool operator == ( const Array & ) const; bool operator != ( const Array & ) const; const int operator [] (int) const; int getSize() const; }; #endif ``` and now array.cpp ``` #include <iostream> using namespace std; #include "array.h" Array::Array (int sze ){ //default constructor edited size = (sze > 0 ? sze : 10); ptr = new int [ size ]; for (int i = 0; i < size; i++) ptr[ i ] = 0; //initial values } Array::Array (const Array & arr ): size(arr.size){ ptr = new int [size]; for ( int i = 0; i< size; i++) ptr [ i ] = arr.ptr [ i ]; } Array::~Array(){ delete [] ptr; } const Array &Array :: operator= ( const Array & right){//IMPO if(&right != this){ //edited self assignment test if(size != right.size){//diff sized arrays delete [] ptr; //reclaim space size = right.size; ptr = new int [ size ]; //space created } } for(int i=0; i<size; i++) ptr[ i ] = right.ptr[ i ]; return *this; //enables cascading a=b=c } bool Array::operator == ( const Array & right) const{ if ( size != right.size ) return false; for ( int i =0; i < size; i++ ){ if ( ptr [ i ] != right.ptr[ i ] ) return false; } return true; } bool Array::operator != ( const Array & right ) const{ //edited return ! (*this == right); } const int Array::operator [] (int subscript) const{ if(subscript >=0 && subscript < size) return ptr[ subscript ]; } int Array::getSize() const{ return size; } //friend functions not in .h ostream & operator << ( ostream & output, const Array & array){ for (int i = 0; i < array.size; i++) output << array.ptr[i] ; } istream & operator >> ( istream & input, Array & array){ for (int i = 0; i < array.size; i++) input >> array.ptr[i]; } ``` now main.cpp ``` #include <cstdlib> #include <iostream> #include "array.h" // " " not <> using namespace std; int main(int argc, char *argv[]) { Array a1(7),a2 (-1),a4; //changed a2 cout<<"Input "<<a1.getSize()<<" integers for Array object a1 and "<<a2.getSize()<<" integers for Array objecta2\n"; cin>>a1>>a2; cout<<"a1 and a2 are\n"; cout<<a1<<endl<<a2; cout<<"a1!=a2 : "<<(a1!=a2)<<endl; cout<<"a1 ==a2: "<<(a1==a2)<<endl; cout<<"Printing a1[5] : "<<a1[5]<<endl; Array a3(a1); a4 = a3; system("PAUSE"); return EXIT_SUCCESS; } ```