我试图使操作员超负荷以将PPM图像添加在一起,从而创建一个新图像。但是,当尝试在函数中创建新对象时,
PPM& PPM::operator*(const double& rhs) const {
int height = this->getHeight();
int width = this-> getWidth();
int mc = this-> getMaxColorValue();
PPM lhs;
// ...
return lhs;
}
还有很多其他内容,以return(lhs);
结尾,当我尝试编译代码时,出现错误消息:
error: reference to local variable 'lhs' returned [-Werror=return-local-addr] PPM lhs;
出了什么问题?
答案 0 :(得分:4)
PPM lhs;
对函数而言是本地的,您不能返回对本地变量的引用。
lhs
将在函数末尾消失,并且如果您编译后输入未定义的行为域,则将有一个悬空引用。
答案 1 :(得分:0)
您的operator*
是成员函数。当这样调用时:
some_ppm * 1.2
1.2
是您的double rhs
。
但是您的lhs
是什么?
查看您的功能,左侧为 不是 some_ppm
。看看:
PPM& PPM::operator*(const double& rhs) const {
// ...
PPM lhs;
// ...
return lhs;
}
在这种情况下,lhs
始终是PPM
的 local ,新实例。
真实 rhs
在哪里?
请记住,当您调用重载运算符时,可以有效地调用成员函数:
some_ppm.operator*(1.2) // actually well formed syntax
是的,您猜对了,它是this
。并且您的运算符不应返回对PPM
的引用,而应像double
或int
甚至甚至是std::string
一样执行操作,并返回副本:
//v----- return by value
PPM PPM::operator*(const double& rhs) const {
int height = this->getHeight();
int width = this-> getWidth();
int mc = this-> getMaxColorValue();
PPM result;
// ...
return result;
}