typedef struct
{
int xpos = 0;
int ypos = 0;
}Point;
Point& PA(const Point &p1, const Point &p2)
{
Point *pptr = new Point;
pptr->xpos = p1.xpos + p2.xpos;
pptr->ypos = p1.ypos + p2.ypos;
return *pptr;
}
int main()
{
Point *pptr1 = new Point;
pptr1->xpos = 3;
pptr1->ypos = 20;
Point *pptr2 = new Point;
pptr2->xpos = 70;
pptr2->ypos = 7;
Point &ref = PA(*pptr1, *pptr2);
delete pptr1;
delete pptr2;
delete &ref;
return 0;
}
答案 0 :(得分:0)
注意:在C ++中不要使用typedef struct
,它是C惯用语,在C ++中除了有害之外什么也没有。只需定义它并可能添加一些ctor:
struct Point
{
int xpos = 0;
int ypos = 0;
Point() = default;
Point( int x, int y ) : xpos( x ), ypos( y ) {}
};
首先,我有一个关于如何声明变量以将局部变量作为引用类型返回的问题。
您不能返回对局部变量的引用,因为它会导致悬挂的引用。尽管可以使用静态变量来实现此“工作”,但这不是一个好的解决方案,但最好将此函数更改为按值返回。
但是,在函数定义中,它返回通过动态分配声明的结构变量。这怎么可能?
您通过取消引用返回对动态分配对象的引用,这最终导致删除引用地址的丑陋行为。你绝对不应该那样做。如果某个函数假定要返回动态分配的对象,请使用智能指针清楚地表明您的意图。在这种情况下,没有必要,您应该按值返回对象:
Point PA(const Point &p1, const Point &p2)
{
Point p;
p.xpos = p1.xpos + p2.xpos;
p.ypos = p1.ypos + p2.ypos;
return p;
}
或者如果您如上所述添加了ctor,则其缩写为:
Point PA(const Point &p1, const Point &p2)
{
return Point( p1.xpos + p2.xpos, p1.ypos + p2.ypos );
}
并且main也变短了:
int main()
{
Point p1( 3, 20 );
Point p2( 70, 7 );
Point r = PA(p1, p2);
std::cout << r.posx << "," << r.posy << std::endl;
return 0;
}
答案 1 :(得分:-2)
您的函数PA()
不返回任何对象,而是返回对对象(a Point
)的引用,该对象已初始化为引用地址为pptr
上的对象。
引用就像指针,但是可以当作真实对象使用(= object)。与指针不同,不能在整个生命周期内分配引用(以引用另一个对象),而是将其绑定到同一对象(分配给引用意味着分配给被引用的对象)。这意味着引用必须被初始化,但是引用也可能悬空(例如,在您的代码中,ref
在delete &ref;
之后悬空)。