В моем коде есть оператор + перегрузка. В этой области я определяю объект ans
, который я хочу построить и вернуть, но кажется, что деструктор отвлекает ans
прежде чем я смогу его вернуть, поэтому этот метод возвращает неопределенное значение.
Я не понимаю, где я не прав? Это деструктор, строитель или моя перегрузка оператора +?
Вот мой код:
class vector1{
int * arr;
int size;
public:
//constructors
vector1(){}
vector1(int n){
size=n;
arr= new int[size];
}
//functions
int get_size(){return size;}
void init(){ //initialize all array cells to 0
for(int i=0;i<size;i++)
arr[i]=0;
}
int get_value_in_index(int index){
return arr[index];
}
void set_value_in_index(int i, int num){
arr[i]=num;
}
int & operator[](int i){
int default_val=0;
if (i<0 || i>size){
cout<<"index not valid"<<endl;
return default_val;
}
return arr[i];
}
vector1 operator+(vector1 & ob);
//destructor
~vector1(){
delete [] arr;
}
};
vector1 vector1:: operator+(vector1 & ob){
vector1 ans(size);
if (ob.get_size()!=size){ //if the arrays are not the same size return array of '0', this array size
cout<<"vectors not the same length. can't sum them"<<endl;
//test
//exit(1);
ans.init();
}
else{
for (int i=0;i<size;i++)
ans.set_value_in_index(i,arr[i]+ob.get_value_in_index(i));
}
return ans;
}
Спасибо за ваше время и помощь.
Ваш оператор + возвращает копию нового vector1
учебный класс.
Но оригинал (объявленный в начале функции) уничтожается в конце блока (до закрывающей скобки) }).
Затем деструктор удаляет внутренний массив arr
,
Так скопировано vector1
объект указывает на удаленный массив.
Вы должны создать конструктор копирования, который также будет копировать внутренний массив.
vector1(const vector1& _other ){
//copy .arr from the other one to this one
}
Когда вы вернетесь из operator+
мелкая копия ans
сделано оставив два экземпляра vector1
указывая на те же данные. Когда первый экземпляр выходит из области видимости, он удаляет данные, на которые указывают оба. Чтобы исправить это, вам нужно добавить конструктор копирования, который делает глубокие копии в vector1
vector1(const vector1& other)
{
// make a deep copy from "other.
}
Вы не определили конструктор копирования, поэтому компилятор создал его по умолчанию.
ваш operator+
возвращает мелкая копия вашего вектора.
когда ans
выходит из области видимости в конце оператора, забирает данные у него.
пожалуйста, прочитайте больше о Что такое правило трех?