I'm designing a template class that has an internal array to store data. It overloads the + operator to add each array element to the corresponding array element in the other operand. It overloads the = operator to perform a deep copy and assign it to another instance of the class.
It compiles fine and the overloading works fine when I use it for a float, which was what the class was originally made for. However when I turn and use it for an int, it gets to the overloaded + operator and I get a segmentation fault. Can someone please point me in the right direction?
Array.h
#include <iostream>
using namespace std;
template<class T>
class Array {
private:
int maxSize;
T* internal;
void init();
public:
~Array();
Array(int);
template<class Y>
friend Array<Y> operator+ (const Array<Y> &x, const Array<Y> &y);
template<class Y>
friend ostream &operator<<(ostream &out, const Array<Y> &y);
Array( const Array<T> &y );
void operator=( const Array<T> &t);
int getSize() const;
void setValue(int index, T number);
T getValue(int index) const;
};
template<class T>
Array<T>::Array(int pass) {
this->maxSize = pass;
internal = new T[maxSize];
init();
}
template<class T>
Array<T>::~Array(){
if( internal ) delete[] internal;
}
template<class T>
void Array<T>::init(){
for(int i =0; i < (maxSize); i++){
internal[i] = 0;
}
}
template<class T>
void Array<T>::operator=(const Array<T>& t){
// if not copying self
if( this != &t ){
maxSize = t.maxSize;
// delete any existing memory
if( internal ) delete[] internal;
// allocate memory for object
init();
// copy dynamic memory
for(int i = 0; i < maxSize; ++i )
this->setValue(i, t.getValue(i)) ;
}
}
template<class T>
Array<T>::Array( const Array<T> &t ){
// This calls overloaded assignment operator
*this = t;
}
template<class Y>
Array<Y> operator+ (const Array<Y> &x, const Array<Y> &y){
Array<Y> returnable(x.getSize());
for(int i = 0; i < y.getSize(); i++){
returnable.setValue(i, (x.getValue(i) + y.getValue(i)));
}
return returnable;
}
template<class Y>
ostream &operator<<(ostream &out, const Array<Y> &y){
out << "Array Result" << endl;
out << "------------" << endl;
for(int i = 0; i < y.getSize(); i++ ){
out << i << " " << y.getValue(i) << endl;
}
return out;
}
template<class T>
int Array<T>::getSize() const{
return this->maxSize;
}
template <class T>
void Array<T>::setValue(int index, T number){
*&internal[index] = number;
}
template<class T>
T Array<T>::getValue(int index) const{
return *&internal[index];
}
main.cpp
#include <iostream>
#include "Array.h"
using namespace std;
int main() {
Array<float> a(3);
a.setValue(0, 1.1);
a.setValue(1, 2.2);
a.setValue(2,3.3);
Array<float> b(3);
b.setValue(0, 1.1);
b.setValue(1, 2.2);
b.setValue(2,3.3);
cout << "a: " << endl << a << endl;
cout << "b:" << endl << b << endl;
Array<float> c(3);
c = a + b;
cout << "c: " << endl << c << endl;
cout << "a: " << endl << a << endl;
cout << "b:" << endl << b << endl;
Array<int> d(3);
d.setValue(0, 1);
d.setValue(1, 2);
d.setValue(2,3);
Array<int> e(3);
e.setValue(0, 1);
e.setValue(1, 2);
e.setValue(2,3);
Array<int> f(3);
f = d + e; // fails here on the addition operator I believe
cout << f;
return 0;
}