通过引用传递向量,但更改不会坚持 c++

Posted

技术标签:

【中文标题】通过引用传递向量,但更改不会坚持 c++【英文标题】:Passing vector by reference, but alterations won't stick c++ 【发布时间】:2014-03-11 06:41:23 【问题描述】:
void RemoveGreenEffect::processImage(vector<Point>& points)

    for (int i = 0; i < points.size(); ++i)
    
        points[i].setGreen(0);
    

此函数正确地引入向量并在本地进行更改。但是,当程序返回主程序时,它不会保留更改。有人可以解释我做错了什么吗?如果有帮助,这里是 main 的调用函数。

for (int i = 0; i < ppm.getRows(); ++i)

    my_effect->processImage(picture.getPicture()[i]); 

my_effect 是指向派生对象 RemoveGreenEffect 的基类指针。 getPicture() 是 Point 对象向量的向量,因此 getPicture()[i] 是 Point 类的向量。目标是一次删除图片中的所有绿色值像素,但同样,更改仅在本地起作用。

编辑,这里是getPicture()

vector<vector<Point>> PointFormatPicture::getPicture()

return _picture;

这就是_picture

vector<vector<Point>> _picture;

【问题讨论】:

显示更多代码。图片中发生了什么? 可以出示getPicture()的声明吗? getPicture 返回_picture 的副本,因此当您将其传递给processImage 时,它不会影响_picture。编译器实际上应该标记一个错误,除非您在非常量对象上调用 operator[] 函数时返回一个 const 引用。 感谢分配,这很有意义。是的,鉴于我使用的是 Visual Studio,编译器没有给出错误,这很奇怪。你知道是否有一种传统的方法来命名一个返回引用的类成员函数,就像你建议的那样? 【参考方案1】:

更改为通过引用返回:

vector<vector<Point>>& PointFormatPicture::getPicture()

   return _picture;

【讨论】:

非常感谢,这很有意义。有没有为此目的命名函数的常规方法? getter 似乎不是正确的方法,而 setter 通常不会返回值......所以我不知道该怎么称呼它! @user3269643:关于这个函数,你可以有一个常量版本和一个非常量版本。您可能希望以不同的方式命名它们。您也可以将其命名为 PointFormatPicture::picture()。有几个例子。也许最常见的是 begin() 和 end(),它们同时存在于 const 和非 const 版本中。

以上是关于通过引用传递向量,但更改不会坚持 c++的主要内容,如果未能解决你的问题,请参考以下文章

C++:试图理解通过引用传递向量

通过指针或引用将映射传递给函数?

通过引用传递向量 C++

C++ 通过引用传递向量字符指针

C++ 向量通过引用语法传递

通过引用传递向量使迭代算法以不同的方式运行