我有一个功能来规范化Vec2D。我收到C4172和C4239错误。我知道我不应该返回局部变量,但我不知道应该返回什么。我应该把它作为指针吗? 方法:
inline Vec2D& normalize()const {
double l = length();
if (x == 0) {
if (y == 0) {
return Vec2D(0, 0);
}
else {
return Vec2D(0, y / l);
}
}
else if (y == 0) {
return Vec2D(x / l, 0);
}
return Vec2D(x / l, y / l);
}
答案 0 :(得分:3)
按值返回局部变量很好。您不应该做的是通过引用返回它们。从退货类型中删除&
。
inline Vec2D normalize()const {
...
答案 1 :(得分:0)
我可能会将其实现为:
inline void normalize(Vec2D* vect) const {
....
像这样,函数的用户可以从堆栈,堆中提供Vec2D
,甚至可以从基类Vect2D
提供派生类。性能良好,因为不涉及复制。
答案 2 :(得分:0)
您在此处尝试返回对临时对象(也是本地对象)的引用 - Vec2D
将对象返回到您的函数,但您没有存储它在任何地方,只是返回一个对它的引用,一旦你移动到代码中的下一条指令就会变成悬空。虽然在这种情况下效果类似于返回对局部变量的引用,但理解差异很重要。从函数退出时局部变量将变为无效,并且临时变量将在下一条指令上变为无效。