operator overloading for Array class

22,052

Solution 1

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:

  1. 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;
    
  2. Array::operator [] should probably throw an exception if the index is out of bounds. Currently it just returns garbage memory.

  3. 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);
    
  4. 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;
    }
    

Solution 2

You have 2 errors in your default constructor:

1) You do not allocate memory for ptr and you try to initialize it, this is certainly an error and cause an undefined behavior, so if you have some invalid value in ptr you may get a segmentation fault or worse you may overwrite value of some of your internal variables!

2) Name of variable of the default constructor is size and size = (size > 0 ? size : 10); change value of local variable size not the size member of your class, and because of that your size member will remain uninitialized and any use of that is illegal and you may still get exceptions like segmentation fault(for example size may be 7476327436 that certainly is far beyond end of your array.

and beside that you have 1 error in your operator !=, since you have if ( *this != right ) and that will use operator != for comparison, and this is a recursive function in all cases and you will get a stack overflow exception, so if you want to check for exact pointers use if ( this != right ) instead of that.

I don't fully check your code first time that I see it, but you have some other errors in your code and I don't know how you even compile it, In multiple places you do not provide return value for your function. Please remember Never ignore compiler warnings there exist to help you correct your programming errors:

const int Array::operator [] (int subscript) const{
    if(subscript >=0 && subscript < size)
        return ptr[ subscript ];
    // If not what should I do?? add a return value here, this is a warning
    // since compiler think somehow you know that your code never reach here
    // but do you really know??
    return 0;
}
ostream & operator << ( ostream & output, const Array & array){
    for (int i = 0; i < array.size; i++)
        output << array.ptr[i] ;
    // You say that your function return an ostream& but where is it??
    // this is an error so compiler have nothing to return instead of you!
    // And if your compiler does not generate an error possibly it return 
    // junk value that will cause an error!!
    return output;
}
istream & operator >> ( istream & input, Array & array){
    for (int i = 0; i < array.size; i++)
        input >> array.ptr[i];
    // again you forget to return an istream& and again this is an error
    return input;
}

but beside that I see no error in your code and it should run with no error

Solution 3

Also, you have en error in your implementation of operator != at line: if ( *this != right ) - recursive definition, so, stack overflow.

Share:
22,052
user1776433
Author by

user1776433

Updated on July 09, 2022

Comments

  • user1776433
    user1776433 almost 2 years

    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;
    }