gpt4 book ai didi

c++ - 对非常量的引用的初始值必须是左值,通过引用错误传递对象类型

转载 作者:行者123 更新时间:2023-12-02 01:41:12 24 4
gpt4 key购买 nike

当我尝试通过将 Point x 和 y 成员变量保持为私有(private)来通过引用传递 Point 对象时,出现以下错误,这就是为什么我得到 x 和y 通过函数 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 返回一个类型为 Point 的临时对象:

Point GetStart();

虽然函数 OffsetVector 不包括对对象的非常量引用:

void OffSetVector(Point&,int,int);

您不能将临时对象与非常量左值引用绑定(bind)。

像这样更改函数 GetStart 的声明:

Point & GetStart();

另外,至少函数 GetEnd 应该更改为:

Point & GetEnd();

您可以为常量和非常量对象重载函数:

Point & GetSgtart();
cosnt Point & GetStart() const;
Point & GetEnd();
const Point & GetEnd() const;

关于c++ - 对非常量的引用的初始值必须是左值,通过引用错误传递对象类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71583479/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com