C++ Zbyt wczesne i liczne wywołanie destruktora

0

Witam. Piszę na zajęcia program dodający wektor liczb zespolonych. Mieliśmy mniej więcej podany na tablicy wzór jak mają wyglądać klasy i dopisać ciała funkcji. Tak więc program wygląda tak:

#include <iostream>
#include <math.h>
using namespace std;

class Liczba{
	float re;
	float im;
	public:
	Liczba(){re=0; im=0;}
	Liczba(float a){re=a; im=a;}
	Liczba(float a,float b){re=a; im=b;}
	Liczba operator+(Liczba a){
		Liczba c = Liczba();
		c.re = re + a.re;
		c.im = im + a.im;
		return c;
	}
	friend ostream& operator<<(ostream& wyjscie, const Liczba& arg);
};

ostream& operator<<(ostream& wyjscie, const Liczba& arg){
	return wyjscie<<arg.re<<" + "<<arg.im<<"i"<<endl;
}

class Wektor{
	Liczba *A;
	int dlugosc;
	public:
		Wektor(int n) {A = new Liczba[n]; dlugosc = n; cout<<"Konstruktor"<<endl;}
		~Wektor(){cout<<"Destruktor"<<endl; delete A;}
		Wektor operator+(Wektor w){
			if(dlugosc==w.dlugosc){
				Wektor c = Wektor(dlugosc);
				for(int i=0;i<dlugosc;i++)
				c.A[i] = A[i] + w.A[i];
				return c;
			}
			else cout<<"Nie mozna dodawac wektorow o roznych dlugosciach"<<endl;
		}
		void Set(int i, Liczba zesp){
			if(i<dlugosc)
			A[i] = zesp;
			else cout<<"Ten wektor ma "<<dlugosc<<" skladowych."<<endl;
		}
		void wyswietl(){
			cout<<"Wektor: "<<endl;
			for(int i=0;i<dlugosc;i++)
			cout<<A[i];
		}
		
};

int main(int argc, char *argv[]) {
	Liczba a(2,3);
	Liczba b(2,3);
	Liczba c(8,7);
	Liczba d(8,7);
	Wektor X = Wektor(2);
	Wektor Y = Wektor(2);
	Wektor Z = Wektor(2);
	X.Set(0,a);
	X.Set(1,b);
	Y.Set(0,c);
	Y.Set(1,d);
	cout<<"\nPrzed dodaniem: "<<endl;
	X.wyswietl();
	Y.wyswietl();
	cout<<"\nPo dodaniu: "<<endl;
	Z = X + Y;
	Z.wyswietl();
	return 0;
}

Problem polega na tym, że po wykonaniu na ekranie dostaje takie coś:

Konstruktor
Konstruktor
Konstruktor

Przed dodaniem:
Wektor:
2 + 3i
2 + 3i
Wektor:
8 + 7i
8 + 7i

Po dodaniu:
Konstruktor
Destruktor
Destruktor
Destruktor
Wektor:
1.08969e+038 + 1.084936e+038i
0 + 0i
Destruktor
Destruktor
Destruktor

Program kompiluję pod DecC++ 5.2.0.3. Gdy wykomentuję destruktor wszystko działa jak należy, wynik dodawania jest 10 + 10i. Może mi ktoś wytłumaczyć dlaczego tak się dzieje, że są prawidłowo 4 konstruktory a aż 6 destruktorów i czemu one działają zanim przypiszę odpowiednie wartości do Z?

0

Nie śledzisz konstruktorów kopiujących (w ogóle ich nie masz). To pewnie są te, których brakuje.

1
~Wektor(){cout<<"Destruktor"<<endl; delete[] A;} // nawiasy kwadratowe przy delete - obowiązkowe
Z = X + Y; // do tego potrzebujesz operator przypisania oraz konstruktor kopiujący
1

w konstruktorze kopiującym musisz przepisać wszystkie elementy do nowej tablicy. Napisałem coś takiego:

                Wektor(const Wektor & wekt) {
                        A = new Liczba[wekt.dlugosc];
                        dlugosc = wekt.dlugosc;
                        
                        for(int i = 0; i < wekt.dlugosc; i++) {
                            A[i] = wekt.A[i];
                        }

                }
                Wektor & operator=(Wektor wekt) {
                    
                    for(int i = 0; i < wekt.dlugosc; i++) {
                        A[i] = wekt.A[i];
                    }
                            
                    return *this;
                }

0
 Wektor operator+(Wektor w){

to powinno być

Wektor operator+(const Wektor &w){

1 użytkowników online, w tym zalogowanych: 0, gości: 1