作为 class 成员的引用初始化
Reference initialization as member of class
我有 class "Segment":
class Segment
{
private:
Point &_a;
Point &_b;
public:
Segment(const Point& start, const Point& end);
~Segment();
};
这是构造函数的实现:
Segment::Segment(const Point& start, const Point& end):
_a(Point(start.x(), start.y())),
_b(Point(end.x(), end.y())),
_segmentID(_freeID++)
{
return;
}
它符合警告:
warning C4413: reference member is initialized to a temporary that doesn't persist after the constructor exits
如何正确初始化 class 构造函数中的引用?如何摆脱这个警告?
P.S。这是另一个有同样问题的构造函数:
Segment::Segment(double x1, double y1, double x2, double y2):
_a(Point(x1, y1)),
_b(Point(x2, y2)),
_segmentID(_freeID++)
{
return;
}
Segment::Segment(const Point& a, const Point& b) :
_a(a), _b(b), _segmentID(_freeID++) { }
并且用于构造 Segment
的 Points
必须持续存在到 Segment
为止,因为它保留对它的引用。
Point(start.x(), start.y())
会构造一个新的(临时的)Point
对象,但是使用它来初始化引用是无效的,因为临时对象会立即超出范围。
你的问题是这样的
Segment::Segment(const Point& start, const Point& end):
_a(Point(start.x(), start.y())),
_b(Point(end.x(), end.y())),
_segmentID(_freeID++)
{
return;
}
在您的初始化列表中,您正在创建一个临时对象。
Point(start.x(), start.y())
一旦创建它的范围退出,这个临时对象就会被销毁,这就是您引用的错误消息告诉您的内容。
您可以将初始化程序更改为以下内容:
Segment::Segment(Point& start, Point& end):
_a(start),
_b(end),
_segmentID(_freeID++)
{
}
问题在于 _a 和 _b 的生命周期不受您的控制。如果这些是基于堆栈的变量,那么当您的对象仍然依赖它们作为有效变量时,它们可能会被销毁。
此外,构造函数中的 return 毫无意义。
我有 class "Segment":
class Segment
{
private:
Point &_a;
Point &_b;
public:
Segment(const Point& start, const Point& end);
~Segment();
};
这是构造函数的实现:
Segment::Segment(const Point& start, const Point& end):
_a(Point(start.x(), start.y())),
_b(Point(end.x(), end.y())),
_segmentID(_freeID++)
{
return;
}
它符合警告:
warning C4413: reference member is initialized to a temporary that doesn't persist after the constructor exits
如何正确初始化 class 构造函数中的引用?如何摆脱这个警告?
P.S。这是另一个有同样问题的构造函数:
Segment::Segment(double x1, double y1, double x2, double y2):
_a(Point(x1, y1)),
_b(Point(x2, y2)),
_segmentID(_freeID++)
{
return;
}
Segment::Segment(const Point& a, const Point& b) :
_a(a), _b(b), _segmentID(_freeID++) { }
并且用于构造 Segment
的 Points
必须持续存在到 Segment
为止,因为它保留对它的引用。
Point(start.x(), start.y())
会构造一个新的(临时的)Point
对象,但是使用它来初始化引用是无效的,因为临时对象会立即超出范围。
你的问题是这样的
Segment::Segment(const Point& start, const Point& end):
_a(Point(start.x(), start.y())),
_b(Point(end.x(), end.y())),
_segmentID(_freeID++)
{
return;
}
在您的初始化列表中,您正在创建一个临时对象。
Point(start.x(), start.y())
一旦创建它的范围退出,这个临时对象就会被销毁,这就是您引用的错误消息告诉您的内容。
您可以将初始化程序更改为以下内容:
Segment::Segment(Point& start, Point& end):
_a(start),
_b(end),
_segmentID(_freeID++)
{
}
问题在于 _a 和 _b 的生命周期不受您的控制。如果这些是基于堆栈的变量,那么当您的对象仍然依赖它们作为有效变量时,它们可能会被销毁。
此外,构造函数中的 return 毫无意义。