#include"iomanip" //控制格式
using namespace std;
const int MAX = 20;
class vector
{
public:
vector(int n){length=n;}
vector(int num[],int n);
friend vector operator + (vector &a,vector &b);
friend vector operator - (vector &a,vector &b);
friend vector operator * (vector &a,vector &b);
vector & operator = (vector & a);
void display();
private:
int X[ MAX ];
int length;
};
vector::vector( int num[],int n)
{
int i;
for(i=0;i<n;i++)
{
X[i]= num[i];
}
length=n;
}
vector operator+(vector & a,vector & b)
{
vector temp(a.length);
for(int i=0;i<a.length;i++)
{
temp.X[i]=a.X[i]+b.X[i];
}
return temp;
}
vector operator-(vector & a,vector & b)
{
vector temp(a.length);
for(int i=0;i<a.length;i++)
{
temp.X[i]= a.X[i]-b.X[i];
}
return temp;
}
vector operator*(vector & a,vector & b)
{
vector temp(a.length);
for(int i=0;i<a.length;i++)
{
temp.X[i] = a.X[i] * b.X[i];
}
return temp;
}
vector & vector:: operator=(vector & a)
{
length=a.length;
for(int i=0;i<a.length;i++)
{
X[i]=a.X[i];
}
return *this;
}
void vector::display()
{
for(int i=0;i<length;i++)
{
cout<<setw(4)<<X[i];
}
cout<<endl;
}
int main()
{
cout<<"输入向量的维数:";
int len;
cin>>len;
int num_1[len],num_2[len];
cout<<"输入含"<<len<<"个数据的向量1:";
int j=0;
while(j<len)
{
cin>>num_1[j];
j++;
}
cout<<"输入含"<<len<<"个数据的向量2:";
int i=0;
while(i<len)
{
cin>>num_2[i];
i++;
}
vector obj1(num_1,len), obj2(num_2,len),obj3(len);
cout<<"************************************************\n"
<<"向量1: ";
obj1.display();
cout<<"向量2: ";
obj2.display();
cout<<"操作:";
char op;
cin>>op;
cout<<endl;
switch(op)
{
case '+' : obj3= obj1+obj2;
break;
case '-' : obj3 = obj1-obj2;
break;
case '*' : obj3 = obj1*obj2;
break;
case '=' : obj3 = obj2; //=>obj3.operator=(obj1)
break;
}
obj3.display();
cout<<"************************************************\n";
system("pause");
return 0;
}
在这个程序中只要将
vector & vector:: operator=(vector & a)
{
length=a.length;
for(int i=0;i<a.length;i++)
{
X[i]=a.X[i];
}
return *this;
}
中的参数改为vector & vector:: operator=(vector a)
即去掉&则程序运行正确,而有了&就出错这是为什么?
9 个解决方案
#1
因为你没有定义拷贝构造函数.
#2
obj1与obj2;相加、相减、相乘、相除、的结果是临时对象
不能被绑定到非const引用参数
不能被绑定到非const引用参数
#3
改成下面应该就没问题了:
vector & vector:: operator=(const vector & a)
#4
#include"iostream"
#include"iomanip" //控制格式
using namespace std;
const int MAX = 20;
class vector
{
public:
vector(int n){length=n;}
vector(int num[],int n);
vector(const vector &obj)
:length(obj.length)
{
for(int i=0;i!=MAX;++i)
{
X[i]=obj.X[i];
}
}
friend vector operator + (vector &a,vector &b);
friend vector operator - (vector &a,vector &b);
friend vector operator * (vector &a,vector &b);
vector & operator = ( vector a); //mark,可以运行了,但是不要这样写
void display();
private:
int X[ MAX ];
int length;
};
vector::vector( int num[],int n)
{
int i;
for(i=0;i<n;i++)
{
X[i]= num[i];
}
length=n;
}
vector operator+(vector & a,vector & b)
{
vector temp(a.length);
for(int i=0;i<a.length;i++)
{
temp.X[i]=a.X[i]+b.X[i];
}
return temp;
}
vector operator-(vector & a,vector & b)
{
vector temp(a.length);
for(int i=0;i<a.length;i++)
{
temp.X[i]= a.X[i]-b.X[i];
}
return temp;
}
vector operator*(vector & a,vector & b)
{
vector temp(a.length);
for(int i=0;i<a.length;i++)
{
temp.X[i] = a.X[i] * b.X[i];
}
return temp;
}
vector & vector:: operator=(vector a) //mark,使用const &
//改为你的vector a也正常运行了
{
length=a.length;
for(int i=0;i<a.length;i++)
{
X[i]=a.X[i];
}
return *this;
}
void vector::display()
{
for(int i=0;i<length;i++)
{
cout<<setw(4)<<X[i];
}
cout<<endl;
}
int main()
{
cout<<"输入向量的维数:";
int len;
cin>>len;
int num_1[100],num_2[100]; //mark:数组不能用变量
cout<<"输入含"<<len<<"个数据的向量1:";
int j=0;
while(j<len)
{
cin>>num_1[j];
j++;
}
cout<<"输入含"<<len<<"个数据的向量2:";
int i=0;
while(i<len)
{
cin>>num_2[i];
i++;
}
vector obj1(num_1,len), obj2(num_2,len),obj3(len);
cout<<"************************************************\n"
<<"向量1: ";
obj1.display();
cout<<"向量2: ";
obj2.display();
cout<<"操作:";
char op;
cin>>op;
cout<<endl;
switch(op)
{
case '+' : obj3= obj1+obj2;
break;
case '-' : obj3 = obj1-obj2;
break;
case '*' : obj3 = obj1*obj2;
break;
case '=' : obj3 = obj2; //=>obj3.operator=(obj1)
break;
}
obj3.display();
cout<<"************************************************\n";
system("pause");
return 0;
}
#5
楼主是不是忘记把类定义中的对应声明改为:vector & vector:: operator=(vector a)
我在vs2008上运行没有问题
我在vs2008上运行没有问题
#6
原来楼主说的是没有&反而对了。。。。
其实你真正错在数组定义的下标是个变量。
其实你真正错在数组定义的下标是个变量。
#7
其实根本错误在于将临时对象传递给非const引用参数,同样道理,楼主重载的+ - *运算符也隐藏着同样的问题,比如说,obj1 + obj2 + obj3;这样的表达式就不能通过编译,同样是因为从在重载的运算符参数是非const引用参数。
解决方法很简单,只需要将重载的运算符参数修改为const vector &即可,
另外,对于这个例子,重载operator=是没有必要的,在用到vector赋值时编译器会自动生成一个vector &operator=(const vector &)函数,其功能和楼主自定义的完全一样,只是编译器生成的函数效率更高。
解决方法很简单,只需要将重载的运算符参数修改为const vector &即可,
另外,对于这个例子,重载operator=是没有必要的,在用到vector赋值时编译器会自动生成一个vector &operator=(const vector &)函数,其功能和楼主自定义的完全一样,只是编译器生成的函数效率更高。
#include<iostream>
#include<iomanip>//控制格式
using namespace std;
const int MAX = 20;
class vector
{
public:
vector(int n){length = n;}
vector(int num[], int n);
//这里参数都设置为const引用
friend vector operator + (const vector &a, const vector &b);
friend vector operator - (const vector &a, const vector &b);
friend vector operator * (const vector &a, const vector &b);
//vector & operator = (const vector & a);/重载operator=不是必须的!
void display();
private:
int X[ MAX ];
int length;
};
vector::vector(int num[], int n)
{
int i;
for(i=0; i<n; i++)
{
X[i]= num[i];
}
length=n;
}
vector operator+(const vector & a, const vector & b)
{
vector temp(a.length);
for(int i=0; i<a.length; i++)
{
temp.X[i] = a.X[i] + b.X[i];
}
return temp;
}
vector operator-(const vector & a, const vector & b)
{
vector temp(a.length);
for(int i=0; i<a.length; i++)
{
temp.X[i] = a.X[i] - b.X[i];
}
return temp;
}
vector operator*(const vector & a, const vector & b)
{
vector temp(a.length);
for(int i=0; i<a.length; i++)
{
temp.X[i] = a.X[i] * b.X[i];
}
return temp;
}
/*
vector & vector:: operator=(const vector & a)
{
length=a.length;
for(int i=0; i<a.length; i++)
{
X[i] = a.X[i];
}
return *this;
}*/
void vector::display()
{
for(int i=0; i<length; i++)
{
cout<<setw(4)<<X[i];
}
cout<<endl;
}
int main()
{
cout<<"输入向量的维数:";
int len;
cin>>len;
int num_1[len], num_2[len];
cout<<"输入含"<<len<<"个数据的向量1:";
int j = 0;
while(j < len)
{
cin>>num_1[j];
j++;
}
cout<<"输入含"<<len<<"个数据的向量2:";
int i = 0;
while(i < len)
{
cin>>num_2[i];
i++;
}
vector obj1(num_1,len), obj2(num_2,len), obj3(len);
cout<<"************************************************\n"
<<"向量1: ";
obj1.display();
cout<<"向量2: ";
obj2.display();
cout<<"操作:";
char op;
cin>>op;
cout<<endl;
switch(op)
{
case '+' : obj3 = obj1 + obj2;
break;
case '-' : obj3 = obj1 - obj2;
break;
case '*' : obj3 = obj1 * obj2;
break;
case '=' : obj3 = obj2; //=>obj3.operator=(obj1)
break;
}
obj3.display();
cout<<"************************************************\n";
system("pause");
return 0;
}
#8
居然自己没搞清楚就发上来了,
int main()
{
cout<<"输入向量的维数:";
int len;
cin>>len;
int num_1[LEN],num_2[LEN];//改成这样,能用len吗?
cout<<"输入含"<<len<<"个数据的向量1:";
#9
C99标准才开始支持变长数组,但是在C99之前,gcc就已经就支持变长数组了
#1
因为你没有定义拷贝构造函数.
#2
obj1与obj2;相加、相减、相乘、相除、的结果是临时对象
不能被绑定到非const引用参数
不能被绑定到非const引用参数
#3
改成下面应该就没问题了:
vector & vector:: operator=(const vector & a)
#4
#include"iostream"
#include"iomanip" //控制格式
using namespace std;
const int MAX = 20;
class vector
{
public:
vector(int n){length=n;}
vector(int num[],int n);
vector(const vector &obj)
:length(obj.length)
{
for(int i=0;i!=MAX;++i)
{
X[i]=obj.X[i];
}
}
friend vector operator + (vector &a,vector &b);
friend vector operator - (vector &a,vector &b);
friend vector operator * (vector &a,vector &b);
vector & operator = ( vector a); //mark,可以运行了,但是不要这样写
void display();
private:
int X[ MAX ];
int length;
};
vector::vector( int num[],int n)
{
int i;
for(i=0;i<n;i++)
{
X[i]= num[i];
}
length=n;
}
vector operator+(vector & a,vector & b)
{
vector temp(a.length);
for(int i=0;i<a.length;i++)
{
temp.X[i]=a.X[i]+b.X[i];
}
return temp;
}
vector operator-(vector & a,vector & b)
{
vector temp(a.length);
for(int i=0;i<a.length;i++)
{
temp.X[i]= a.X[i]-b.X[i];
}
return temp;
}
vector operator*(vector & a,vector & b)
{
vector temp(a.length);
for(int i=0;i<a.length;i++)
{
temp.X[i] = a.X[i] * b.X[i];
}
return temp;
}
vector & vector:: operator=(vector a) //mark,使用const &
//改为你的vector a也正常运行了
{
length=a.length;
for(int i=0;i<a.length;i++)
{
X[i]=a.X[i];
}
return *this;
}
void vector::display()
{
for(int i=0;i<length;i++)
{
cout<<setw(4)<<X[i];
}
cout<<endl;
}
int main()
{
cout<<"输入向量的维数:";
int len;
cin>>len;
int num_1[100],num_2[100]; //mark:数组不能用变量
cout<<"输入含"<<len<<"个数据的向量1:";
int j=0;
while(j<len)
{
cin>>num_1[j];
j++;
}
cout<<"输入含"<<len<<"个数据的向量2:";
int i=0;
while(i<len)
{
cin>>num_2[i];
i++;
}
vector obj1(num_1,len), obj2(num_2,len),obj3(len);
cout<<"************************************************\n"
<<"向量1: ";
obj1.display();
cout<<"向量2: ";
obj2.display();
cout<<"操作:";
char op;
cin>>op;
cout<<endl;
switch(op)
{
case '+' : obj3= obj1+obj2;
break;
case '-' : obj3 = obj1-obj2;
break;
case '*' : obj3 = obj1*obj2;
break;
case '=' : obj3 = obj2; //=>obj3.operator=(obj1)
break;
}
obj3.display();
cout<<"************************************************\n";
system("pause");
return 0;
}
#5
楼主是不是忘记把类定义中的对应声明改为:vector & vector:: operator=(vector a)
我在vs2008上运行没有问题
我在vs2008上运行没有问题
#6
原来楼主说的是没有&反而对了。。。。
其实你真正错在数组定义的下标是个变量。
其实你真正错在数组定义的下标是个变量。
#7
其实根本错误在于将临时对象传递给非const引用参数,同样道理,楼主重载的+ - *运算符也隐藏着同样的问题,比如说,obj1 + obj2 + obj3;这样的表达式就不能通过编译,同样是因为从在重载的运算符参数是非const引用参数。
解决方法很简单,只需要将重载的运算符参数修改为const vector &即可,
另外,对于这个例子,重载operator=是没有必要的,在用到vector赋值时编译器会自动生成一个vector &operator=(const vector &)函数,其功能和楼主自定义的完全一样,只是编译器生成的函数效率更高。
解决方法很简单,只需要将重载的运算符参数修改为const vector &即可,
另外,对于这个例子,重载operator=是没有必要的,在用到vector赋值时编译器会自动生成一个vector &operator=(const vector &)函数,其功能和楼主自定义的完全一样,只是编译器生成的函数效率更高。
#include<iostream>
#include<iomanip>//控制格式
using namespace std;
const int MAX = 20;
class vector
{
public:
vector(int n){length = n;}
vector(int num[], int n);
//这里参数都设置为const引用
friend vector operator + (const vector &a, const vector &b);
friend vector operator - (const vector &a, const vector &b);
friend vector operator * (const vector &a, const vector &b);
//vector & operator = (const vector & a);/重载operator=不是必须的!
void display();
private:
int X[ MAX ];
int length;
};
vector::vector(int num[], int n)
{
int i;
for(i=0; i<n; i++)
{
X[i]= num[i];
}
length=n;
}
vector operator+(const vector & a, const vector & b)
{
vector temp(a.length);
for(int i=0; i<a.length; i++)
{
temp.X[i] = a.X[i] + b.X[i];
}
return temp;
}
vector operator-(const vector & a, const vector & b)
{
vector temp(a.length);
for(int i=0; i<a.length; i++)
{
temp.X[i] = a.X[i] - b.X[i];
}
return temp;
}
vector operator*(const vector & a, const vector & b)
{
vector temp(a.length);
for(int i=0; i<a.length; i++)
{
temp.X[i] = a.X[i] * b.X[i];
}
return temp;
}
/*
vector & vector:: operator=(const vector & a)
{
length=a.length;
for(int i=0; i<a.length; i++)
{
X[i] = a.X[i];
}
return *this;
}*/
void vector::display()
{
for(int i=0; i<length; i++)
{
cout<<setw(4)<<X[i];
}
cout<<endl;
}
int main()
{
cout<<"输入向量的维数:";
int len;
cin>>len;
int num_1[len], num_2[len];
cout<<"输入含"<<len<<"个数据的向量1:";
int j = 0;
while(j < len)
{
cin>>num_1[j];
j++;
}
cout<<"输入含"<<len<<"个数据的向量2:";
int i = 0;
while(i < len)
{
cin>>num_2[i];
i++;
}
vector obj1(num_1,len), obj2(num_2,len), obj3(len);
cout<<"************************************************\n"
<<"向量1: ";
obj1.display();
cout<<"向量2: ";
obj2.display();
cout<<"操作:";
char op;
cin>>op;
cout<<endl;
switch(op)
{
case '+' : obj3 = obj1 + obj2;
break;
case '-' : obj3 = obj1 - obj2;
break;
case '*' : obj3 = obj1 * obj2;
break;
case '=' : obj3 = obj2; //=>obj3.operator=(obj1)
break;
}
obj3.display();
cout<<"************************************************\n";
system("pause");
return 0;
}
#8
居然自己没搞清楚就发上来了,
int main()
{
cout<<"输入向量的维数:";
int len;
cin>>len;
int num_1[LEN],num_2[LEN];//改成这样,能用len吗?
cout<<"输入含"<<len<<"个数据的向量1:";
#9
C99标准才开始支持变长数组,但是在C99之前,gcc就已经就支持变长数组了