Error overloading operator + class template vector

Hi all! I'm trying to implement a vector class in C + +. However when I go to actually run the main, it generates an interrupt operating system. Do you see a mistake? Thank you!

MAIN.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "header.h"


int main()
{
	// Definisco le istanze delle classi
	vettore <int> vet;
	vettore <int> vet2;
	vettore <int> vet3;

	//  SEZIONE VETTORI
		// Leggo i valori delle varie istanze
		vet.leggi_vettore();
		vet2.leggi_vettore();
		// Svolgo operazioni sulle classi
		int scel;
		cout<<"\nInserire:\n1 per la somma.\n2 per l'assegnazione.\nScelta: ";
		cin>>scel;
		switch(scel)
		{
		case 1:
			vet3 = vet+vet2;
			cout<<"\nIl risultato e': \n";
			vet3.stampa_vettore();
			break;
		case 2:
			//Faccio la verifica dell'assegnazione
			vet=vet2;
			vet2=vet2+vet;
			// Stampo vet e vet2 e devono essere diversi.
			vet.stampa_vettore();
			vet2.stampa_vettore();
			break;
		default:
			cout<<"\nSCELTA ERRATA!!!\n";
		}
return 0;
}


HEADER.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <stdlib.h>

#include <cmath>
using namespace std;

//       **********  CLASSE VETTORE  **********

// Definisco la classe template Vettore
template <class T>
class vettore
{
public:
	// Definisco proprietà classi
	int n;
	T* elem;
	// Definisco funzioni membro
	vettore();       // Costruttore
	vettore(int size);  //Secondo costruttore
    ~vettore();   // Distruttore
	void leggi_vettore();
	void stampa_vettore();
	int GetSize();
	vettore<T> operator + (vettore<T> a);  // Overloading oepratore + per sommare vettori
	vettore<T> operator = (vettore<T>& a);  // Overloading operatore = per assegnare vettori
private:
protected:
};

// Definisco il costruttore della classe Vettore
template <class T> vettore <T>::vettore()
{
	n=0;
	elem = new T[];
}

// Definisco un secondo costruttore che mi inizializza la classe
template <class T> vettore <T>::vettore(int size)
{
	n=size;
	T* elem=new T[n];
}

// Definisco il distruttore della classe Vettore
template <class T> vettore <T>::~vettore()
{
	delete elem;
}

template <class T> int vettore <T>::GetSize()
{
	return n;
}

// Implemento la funzione membro leggi_Vettore
template <class T> void vettore <T>::leggi_vettore()
{
	cout<<"Inserisci il numero di elementi del vettore: ";
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cout<<"Elemento: ";
		cin>>elem[i];
	}
	return;
}

// Implemento la funzione membro stampa_Vettore
template <class T> void vettore <T>::stampa_vettore()
{
	for(int i=0;i<n;i++)
		cout<<"L'elemento "<<i+1<<" del vettore e': "<<elem[i]<<"\n";
}

// Sovraccarico l'operatore + in modo da renderlo adatto a sommare due elementi della classe Vettore
template <class T> vettore<T> vettore <T>::operator+ (vettore a)
{
	vettore c(10);

	if(a.GetSize()==n)
	{
		for (int i=0;i<n;i++)
			c.elem[i]=this->elem[i]+a.elem[i];		
	}
	else
	{
		cout<<"WARNING: Le dimensioni dei due vettori non corrispondono. \n";
		/*return NULL;*/
	}
	return c;
}

// Overloading operator =
template <class T> vettore<T> vettore<T>::operator = (vettore<T>& a)
{
	this->n= a.GetSize();
	this->elem = new T[n];
		for (int i=0;i<a.GetSize();i++)
				this->elem[i]=a.elem[i];
 return *this;
}



Thank you all for the help!
Compile errors:
elem = new T[]; illegal
vet2=vet2+vet; `operator+' returns a temporary, but `operator=' requires a non-constant reference (you need to observe const correctness)

Logic errors:
_ Destructor should delete[] elem;
_ `vettore(int size)' creates a local `elem' variable (leaks memory and fails to initialize members)
_ `leggi_vettore()' access out of bounds.
_ `operator=' leaks memory and fails with self-assignment
You are right. As regards the second compile error was my oversight. Can you tell me instead of a correct solution to the first compile error? Thanks and sorry but it's a while that I program in C + + and start over is hard!
new T[0]
new T[0] does not solve the problem :(
What problem is not being solved? Does it not compile? Does it not run? Does it eat your homework?
Last edited on
The constructor throws a bad allocation. The program compiles but when it comes instruction that involves the constructor crashes.
According to this thread, the new T[0] should work but it can still throw an exception. I can't say whether that is true for all compilers because I've never tried to do it.
http://stackoverflow.com/questions/1087042/c-new-int0-will-it-allocate-memory

You might want to search on other threads to find other tips about that concept. Alternatively, why don't you just initialize the pointer to zero instead of allocating an array of 0? It should be safe since your functions check the value of n before trying to access elements. Just double check that the zero initialized pointer will never be used in other functions if the caller forgets to allocate before using some of the functions.


Your assignment operator will leak memory in some cases. You aren't checking to see if existing array needs to be deallocated before creating the new one. That's unrelated to the crash, but is just another observation.
Topic archived. No new replies allowed.