Ну вот и следующая проблема

Вобщем вот задание
Разработайте пользовательский тип ” вектор в n-мерном пространстве”. Для разрабатываемого типа обязательно определите:
• конструктор (или несколько, если необходимо)
• набор методов ”get” и ”set” ;
• операторы + и – для сложения и вычитания векторов с получением нового вектора (суммы или разности);
• оператора * для вычисления скалярного произведения двух векторов;
• оператор присваивания;
• оператор сравнения ==;
(rrrFer, вам должно быть знакомо

)
Он собственно реализован (опять же спасибо rrrFer

), но работает не одекватно. Т.е. если у меня допустим все вектора в 1-мерном пространстве - все замечательно работае, если один из них в 3-мерном, тоже работет, но если уже 2 в 3-мерном(и больше), то при выполнении перегруженых операций удаляется массив кординат первого из векторов (допустим в v1+v2 удаляется v1), хотя теоретически не должен!
Ну вопрос мне кажется вполне очевиден:
Что происходит и как это исправить?
[codebox] #include <iostream>
#include <stdio.h>
using namespace std;
class vector{
private:
double *mas;
int n;
public:
vector(){
cout<<"конструктор по умолчанию\n";
n=1;
mas=new double[1];
mas[0]=0;
}
vector (int n1){
cout<<"Конструктор ручного ввода вызван\n";
n=n1;
int i;
mas=new double [n];
printf("ввод координат вектора %d -мерного пространства\n",n);
for(i=0;i<n;i++){
printf("введите %d-ую координату\n",(1+i));
cin>>mas
;
}
}
vector (int n1,double *k){
cout<<"Автоматический конструктор вызван\n";
int i;
n=n1;
mas=new double [n];
for(i=0;i<n;i++)
mas=k;
}
vector:: ~vector(){
cout<<"Деструктор вызван. Объект удален\n";
delete [] mas;
}
double get_koord (int a) const {
if(a<=n)
return mas[a-1];
else
return 0;
}
int vector::get_prost()const {
return n;
}
void set_koord (int a, double q);
vector operator + ( vector &v1);
vector operator + ( const double a) const;
vector operator - ( vector &v1);
vector operator - ( const double a) const;
double operator * ( const vector &v1) const;
vector* operator = ( vector & v1);
bool operator == ( const vector &v1) const;
void coutv () const;
};
void vector:: set_koord(int a,double q){
if (a<=n)
mas[a-1]=q;
else cout<<"невозможни изменит несуществующую коорднату вектора\n"<<endl;
}
vector vector:: operator +( vector &v1){
int i;
double *mas1;
if (n==v1.n){
mas1=new double [n];
for (i=0;i<n;i++)
mas1=mas+v1.mas;
vector *v2=new vector(n,mas1);
return *v2;
}
else cout<<" невозможно сложит вектра в различных пространствах!\n"<<endl;
return *this;
}
vector vector:: operator -( vector &v1) {
int i;
double *mas1;
if (n==v1.n){
mas1=new double [n];
for (i=0;i<n;i++)
mas1=mas-v1.mas;
vector *v2=new vector(n, mas1);
return *v2;
}
else cout<<" невозможно отнять вектора в различных пространствах!\n"<<endl;
return *this;
}
double vector:: operator *(const vector &v1) const{
int i;
double s=0;
if (n==v1.n){
for (i=0;i<n;i++)
s=s+mas*v1.mas;
return s;
}
else cout<<" невозможно найти скалярное роизведение векторов в различных пространствах!\n"<<endl;
return 0;
}
vector* vector:: operator =(vector &v1){
int i;
if (n==v1.n){
for (i=0;i<n;i++)
mas=v1.mas;
return this;
}
else cout<<" невозможно выполнить операцию присваивания над векторами в различных пространствах!\n"<<endl;
return this;
}
bool vector:: operator == ( const vector &v1) const{
int i,k=0;
if (n==v1.n){
for (i=0;i<n;i++)
if (mas!=v1.mas)
k++;
if (k==0){
cout<<" равны\n"<<endl;
return true;
}
else {
cout<<" не равны\n"<<endl;
return false;
}
}
else cout<<" невозможно сравнить вектора в различных пространствах!\n"<<endl;
return false;
}
void vector:: coutv () const
{
int i;
cout<<"(";
for (i=0;i<n;i++){
cout<<mas;
if (i!=n-1)
cout<<";";
}
cout<<")"<<endl;
}
int main (){
setlocale (LC_ALL,".1251");
vector *v1=new vector() , *v2=new vector(1),*v3=new vector(1),
*v4=new vector(1), *v5=new vector(),*v6=new vector(),*v7=new vector();
cout<<"КОНСТРУКТОР ЗАДАЕТ ИЗНАЧАЛЬНЫЕ ЗНАЧЕНИЯ:\n";
cout<<"v1 ";
v1->coutv();
cout<<"v2 ";
v2->coutv();
cout<<"v3 ";
v3->coutv();
cout<<"v4 ";
v4->coutv();
cout<<"v5 ";
v5->coutv();
cout<<"v6 ";
v6->coutv();
cout<<"v7 ";
v7->coutv();
cout<<"*************\n";
cout<<"МЕТОД SET \n";
cout<<"v1 изначально имеет координаты:";
v1->coutv();
cout<<"после изменения:";
v1->set_koord(1,2.2);
v1->coutv();
cout<<"*************\n";
cout<<"МЕТОД GET\n";
cout<<"v1 имеет координаты\n";
cout<<"x="<<v1->get_koord(1)<<endl;
cout<<"**************\n";
cout<<"СУММА И ОПЕРАТОР ПРИСВАИВАНИЯ\n";
cout<<"v2 имеет координаты:";
v2->coutv();
cout<<"v3 имеет координаты:";
v3->coutv();
cout<<"v5=v2+v3\n";
cout<<"v5 имеет новые координаты:";
*v5=*v2+*v3;
v5->coutv();
cout<<"--------\n";
cout<<"v2 и v3 будут иметь пежнии координатв:\n";
v2->coutv();
v3->coutv();
cout<<"**************\n";
cout<<"РАЗНОСТЬ И ОПЕРАТОР ПРИСВАИВАНИЯ\n";
cout<<"v4 имеет координаты:";
v4->coutv();
cout<<"v3 имеет координаты:";
v3->coutv();
cout<<"v6=v4-v3\n";
* v6=*v4-*v3;
cout<<"v6 имеет новые координаты:";
v6->coutv();
cout<<"--------\n";
cout<<"v4 и v3 будут иметь пежнии координатв:\n";
v4->coutv();
v3->coutv();
cout<<"***************\n";
cout<<"СКАЛЯРНОЕ ПРОИЗВЕДЕНИЕ\n";
cout<<"v4 имеет координаты:";
v4->coutv();
cout<<"v3 имеет координаты:";
v3->coutv();
cout<<"скалярное произведение векторов v3 и v4 равно\n";
cout<<(*v4)*(*v3)<<endl;
cout<<"***************\n";
cout<<"ОПЕРАТОР ПРИСВАИВАНИЯ\n";
cout<<"v7 имеет изначальные координаты:\n";
v7->coutv();
cout<<"v4 имеет координаты:\n";
v4->coutv();
cout<<"присваиваем значение v4 вектору v7 \n";
v7=v4;
cout<<"тепери v7 имеет координаты ";
v7->coutv();
cout<<"*************\n";
cout<<"ОПЕРАТОР == \n";
cout<<"v3 имеет координаты:";
v3->coutv();
cout<<"v4 имеет координаты:";
v4->coutv();
cout<<"v7 имеет координаты ";
v7->coutv();
cout<<"v3 и v4 ";
*v3==*v4;
cout<<"v4 и v7 ";
*v4==*v7;
system("pause");
return 0;
}
[/codebox]
Спросила у препода - она сказала, что я в main-е ерунду делаю,т.е. выделяю память, и опять ее потом в конструкторе выделяю. Ну я убрала =new vector, еще хуже стало - количество координат не меняется, что бы я в скодках ни писала + ошибки, вобщем полный боевой комплект!
Так собственно какую роль играет *v1=new vector() и почему без него нельзя?
Надеюсь выразилась достаточно ясно 