对非常量的引用的初始值必须是左值,通过引用错误传递对象类型
initial value of reference to non-const must be an lvalue, Passing an object type by reference error
当我尝试通过将 Point
x 和 y 成员变量保持为私有来通过引用传递 Point
对象时出现以下错误,这就是为什么我通过函数 GetX()
和 GetY()
我该如何解决错误并使其按预期工作。
错误日志:
CppReview.cpp: In function 'int main()':
CppReview.cpp:92:30: error: cannot bind non-const lvalue reference of type 'Point&' to an rvalue of type 'Point'
92 | v.OffSetVector(v.GetStart(),1,3);
| ~~~~~~~~~~^~
CppReview.cpp:79:34: note: initializing argument 1 of 'void Vector::OffSetVector(Point&, int, int)'
79 | void Vector::OffSetVector(Point& p,int xoffset,int yoffset){
代码:
class Point{
private:
int x,y;
public:
Point(){
x = y = 0;
}
Point(int x,int y){
this->x = x;
this->y = y;
}
Point(float x,float y){
this->x = x;
this->y = y;
}
void SetX(int x){
this->x = x;
}
void SetY(int y){
this->y = y;
}
void Display(){
cout<<"("<<this->x<<','<<this->y<<")\n";
}
void move(int i=0,int j=0){
this->x+=i;
this->y+=j;
}
int& GetX(){
return (this->x);
}
int& GetY(){
return this->y;
}
};
class Vector{
Point start,end;
public:
Vector(){
this->start = Point(0,0);
this->end = Point(1,1);
}
Vector(int sx,int sy,int ex,int ey){
this->start = Point(sx,sy);
this->end = Point(ex,ey);
}
float ComputeDistance(Point,Point);
Point GetStart();
Point GetEnd();
void OffSetVector(Point&,int,int);
void Show();
};
float Vector::ComputeDistance(Point p1,Point p2){
int p1x = p1.GetX();
int p1y = p1.GetY();
int p2x = p2.GetX();
int p2y = p2.GetY();
float dist = sqrt((p1x-p2x)*(p1x-p2x)+(p1y-p2y)*(p1y-p2y));
return dist;
}
Point Vector::GetStart(){
return this->start;
}
Point Vector::GetEnd(){
return this->end;
}
void Vector::OffSetVector(Point& p,int xoffset,int yoffset){
p.GetX()+=xoffset;
p.GetY()+=yoffset;
}
void Vector::Show(){
cout<<this->GetStart().GetX()<<','<<this->GetStart().GetY()<<" : "<<this->GetEnd().GetX()<<','<<this->GetEnd().GetY()<<"\n";
}
int main(){
Vector v(1,1,3,3);
v.Show();
v.OffSetVector(v.GetStart(),1,3);
return 0;
}
函数 GetStart returns Point 类型的临时对象:
Point GetStart();
而函数 OffsetVector 不包含对对象的 non-constant 引用:
void OffSetVector(Point&,int,int);
您不能将临时对象与 non-constant 左值引用绑定。
将函数 GetStart 的声明更改为:
Point & GetStart();
此外,至少函数 GetEnd 应该更改为:
Point & GetEnd();
您可以重载常量和 non-constant 对象的函数:
Point & GetSgtart();
cosnt Point & GetStart() const;
Point & GetEnd();
const Point & GetEnd() const;
问题是表达式v.GetStart()
是类型Point
的右值,因此它不能绑定到 non-const 左值引用 例如 Point&
.
为了解决这个你需要改变成员函数OffSetVector
的第一个参数p
如下图:
class Vector{
//--------------------vvvvv------------------>const added here
void OffSetVector(const Point&,int,int);
};
//------------------------vvvvv------------------------------------>const added here
void Vector::OffSetVector(const Point& p,int xoffset,int yoffset){
//----------vv------------> += won't work here because of the added const
p.GetX()+=xoffset;
//----------vv------------> += won't work here because of the added const
p.GetY()+=yoffset;
}
但请注意,由于添加了 const
.
,上述内容将不起作用
解决方案
所以要解决这个问题,你应该将 GetStart
的 return 类型更改为 Point&
,如下所示:
class Vector{
//-------v----------------->return by reference
Point& GetStart();
};
//---v--------------------->return by reference
Point& Vector::GetStart(){
return this->start;
}
同样,您应该将 GetEnd
的 return 类型也更改为 Point&
而不是 Point
。此外,还有一个选项可以为 const
和 non-const
对象重载 GetStart
和 GetEnd
。
当我尝试通过将 Point
x 和 y 成员变量保持为私有来通过引用传递 Point
对象时出现以下错误,这就是为什么我通过函数 GetX()
和 GetY()
我该如何解决错误并使其按预期工作。
错误日志:
CppReview.cpp: In function 'int main()':
CppReview.cpp:92:30: error: cannot bind non-const lvalue reference of type 'Point&' to an rvalue of type 'Point'
92 | v.OffSetVector(v.GetStart(),1,3);
| ~~~~~~~~~~^~
CppReview.cpp:79:34: note: initializing argument 1 of 'void Vector::OffSetVector(Point&, int, int)'
79 | void Vector::OffSetVector(Point& p,int xoffset,int yoffset){
代码:
class Point{
private:
int x,y;
public:
Point(){
x = y = 0;
}
Point(int x,int y){
this->x = x;
this->y = y;
}
Point(float x,float y){
this->x = x;
this->y = y;
}
void SetX(int x){
this->x = x;
}
void SetY(int y){
this->y = y;
}
void Display(){
cout<<"("<<this->x<<','<<this->y<<")\n";
}
void move(int i=0,int j=0){
this->x+=i;
this->y+=j;
}
int& GetX(){
return (this->x);
}
int& GetY(){
return this->y;
}
};
class Vector{
Point start,end;
public:
Vector(){
this->start = Point(0,0);
this->end = Point(1,1);
}
Vector(int sx,int sy,int ex,int ey){
this->start = Point(sx,sy);
this->end = Point(ex,ey);
}
float ComputeDistance(Point,Point);
Point GetStart();
Point GetEnd();
void OffSetVector(Point&,int,int);
void Show();
};
float Vector::ComputeDistance(Point p1,Point p2){
int p1x = p1.GetX();
int p1y = p1.GetY();
int p2x = p2.GetX();
int p2y = p2.GetY();
float dist = sqrt((p1x-p2x)*(p1x-p2x)+(p1y-p2y)*(p1y-p2y));
return dist;
}
Point Vector::GetStart(){
return this->start;
}
Point Vector::GetEnd(){
return this->end;
}
void Vector::OffSetVector(Point& p,int xoffset,int yoffset){
p.GetX()+=xoffset;
p.GetY()+=yoffset;
}
void Vector::Show(){
cout<<this->GetStart().GetX()<<','<<this->GetStart().GetY()<<" : "<<this->GetEnd().GetX()<<','<<this->GetEnd().GetY()<<"\n";
}
int main(){
Vector v(1,1,3,3);
v.Show();
v.OffSetVector(v.GetStart(),1,3);
return 0;
}
函数 GetStart returns Point 类型的临时对象:
Point GetStart();
而函数 OffsetVector 不包含对对象的 non-constant 引用:
void OffSetVector(Point&,int,int);
您不能将临时对象与 non-constant 左值引用绑定。
将函数 GetStart 的声明更改为:
Point & GetStart();
此外,至少函数 GetEnd 应该更改为:
Point & GetEnd();
您可以重载常量和 non-constant 对象的函数:
Point & GetSgtart();
cosnt Point & GetStart() const;
Point & GetEnd();
const Point & GetEnd() const;
问题是表达式v.GetStart()
是类型Point
的右值,因此它不能绑定到 non-const 左值引用 例如 Point&
.
为了解决这个你需要改变成员函数OffSetVector
的第一个参数p
如下图:
class Vector{
//--------------------vvvvv------------------>const added here
void OffSetVector(const Point&,int,int);
};
//------------------------vvvvv------------------------------------>const added here
void Vector::OffSetVector(const Point& p,int xoffset,int yoffset){
//----------vv------------> += won't work here because of the added const
p.GetX()+=xoffset;
//----------vv------------> += won't work here because of the added const
p.GetY()+=yoffset;
}
但请注意,由于添加了 const
.
解决方案
所以要解决这个问题,你应该将 GetStart
的 return 类型更改为 Point&
,如下所示:
class Vector{
//-------v----------------->return by reference
Point& GetStart();
};
//---v--------------------->return by reference
Point& Vector::GetStart(){
return this->start;
}
同样,您应该将 GetEnd
的 return 类型也更改为 Point&
而不是 Point
。此外,还有一个选项可以为 const
和 non-const
对象重载 GetStart
和 GetEnd
。