读书人

【重载运算符】,该怎么解决

发布时间: 2012-03-22 17:43:57 作者: rapoo

【重载运算符】
本人刚学,,很是愚钝啊。。想了好久还是不知道。。求解啊。。应该是加法重载的不对。。

#include<iostream>
#include<iomanip>
using namespace std;
class Vector
{
public:
Vector();
Vector( int );
Vector( Vector &v );
~Vector();
Vector operator+ ( Vector & );
Vector operator- ( Vector & );
Vector operator* ( Vector & );
Vector operator/ ( Vector & );
Vector &operator= ( Vector & );
friend ostream & operator<< ( ostream &, Vector & );
friend istream & operator>> ( istream &, Vector & );
double * V;
int len;
};
Vector::Vector()
{
V = NULL;
len = 0;
}
Vector::Vector( int a )
{
len = a;
V = new double[len];
/*for( int i=0; i<len;i++ )
V[i] = 0;*/
}
Vector::Vector( Vector &v )
{
len = v.len;
if( V != NULL )
delete []V;
V = new double[len];
for( int i=0; i<len; i++ )
V[i] = v.V[i];
}
Vector::~Vector()
{
delete []V;
V = NULL;
len = 0;
}
Vector Vector::operator+ ( Vector &v )
{
if( len != v.len )
{
cout << "These two Vectors can't be calculated together\n";
exit(0);
}
Vector temp( len );
for( int i=0; i<len; i++ )
temp.V[i] = V[i] + v.V[i];
return temp;
}
Vector Vector::operator-( Vector &v )
{
if( len != v.len )
{
cout << "These two Vectors can't be calculated together\n";
exit(0);
}
Vector temp( v.len );
for( int i=0; i<len; i ++ )
temp.V[i] = V[i] - v.V[i];
return temp;
}
Vector Vector::operator*( Vector &v )
{
if( len != v.len )
{
cout << "These two Vectors can't be calculated together\n";
exit(0);
}
Vector temp( v.len );
for( int i=0; i<len; i ++ )
temp.V[i] = V[i] * v.V[i];
return temp;
}
Vector Vector::operator/( Vector &v )
{
if( len != v.len )
{
cout << "These two Vectors can't be calculated together\n";
exit(0);
}
Vector temp( v.len );
for( int i=0; i<len; i ++ )
temp.V[i] = V[i] / v.V[i];
return temp;
}
Vector& Vector::operator=( Vector &v )
{
if( len != v.len )
{
cout << "These two Vectors can't be calculated together\n";
exit(0);
}
for( int i=0; i<len; i ++ )
V[i] = v.V[i];
return *this;
}
ostream & operator<< ( ostream & output, Vector & v )
{
for( int i=0; i<v.len; i++ )
output << setw(8) << setprecision(2) << v.V[i];
cout << endl;
return output;
}
istream & operator>> ( istream & input, Vector & v )
{
for( int i=0; i<v.len; i++ )
input >> v.V[i];
return input;
}

int main()
{
cout << "Input the lenght of the Vector A and Vector B :\n";
int n;
cin >> n;
Vector A(n), B(n),C(n);
cout << "Input those numbers :\n";
cin >> A >> B;


cout << "The result of A + B :\n";
C = A + B;
cout << C;

cout << "The result of A - B :\n";
C = A - B;
cout << C;

cout << "The result of B - A :\n";
C = B - A;
cout << C;

cout << "The result of A * B :\n";
C = A * B;
cout << C;;

cout << "The result of A / B :\n";
C = A / B;
cout << C;

cout << "The result of B / A :\n";
C = B / A;
cout << C;
}

------解决方案--------------------


探讨

引用:

C/C++ code

class Vector
{
public:
Vector();
Vector( int );
Vector( Vector &v );
~Vector();
Vector& operator+ ( const Vector & );
Vector&am……

[解决办法]
他这个new()是不会在函数返回后析构的,但是需要自己析构(但是好像是返回了就没法析构的,应该避免)
而你那个是局部变量,在函数返回后会析构的,
[解决办法]
lz把拷贝构造和赋值重载换一下
如果你拷贝构造里delete[] V的话,operator返回值会导致返回时有临时变量调用析构,析构后的临时值会调用用拷贝构造,导致多次delete[] ;
如果像1楼返回引用,可以临时解决问题,但会导致拷贝构造后改变了形参,如Vector D(A),后,形成D==A;

在拷贝构造中不用调用delete[],因为这时还没有new东西出来;
而在赋值中,需要先delete[]

代码大概就是Vector::vector(Vector &) 与operator=换一下,调整一下,希望有说明白。。

读书人网 >C++

热点推荐