operator overloading for Array class
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:
Array::operator !=
is defined in terms of itself. It should be similar tooperator==
, or you can re-use it withif( *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 tosize
assigns to the parameter, not to the member. Change the first line to:this->size = (size > 0 ? size : 10);
operator<<
andoperator>>
should returnoutput
andinput
, 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.
user1776433
Updated on July 09, 2022Comments
-
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; }