如何解决通过迭代器进行的修改未反映
我有一个Slide对象列表。每个Slide对象都有一个滑动元素向量,该滑动元素向量是另一类,例如具有成员的ItemProperties。
int调整大小 int旋转 int移动
void ResizeItem(int resize_val);
void RotateItem(int rotate_val);
void MoveItem(int move_val);
我正在像这样迭代对象列表 “迭代部分”
auto slidelist_ptr=VDECK.getSlideList(); /*returns list<Slide> by reference */
auto slidelist_itr=slidelist_ptr.begin(); /*returns iterator to beginning of Slide list*/
auto slidelemnts_itr=slidelist_itr->getSlideElemnt().begin(); /*returns iterator to beginning of slide list elements*/
in1=_getch();
if(in1!=KEY_ARROW_1)
{
**VDECK.selectedSlideOperations((*slidelist_itr),in1-48);**
throw std::runtime_error("Operation success\n");
}
++slidelist_itr;
slidelemnts_itr=slidelist_itr->getSlideElemnt().begin();
在selectedSlideOperations函数中,我传递了特定的幻灯片对象,并将其作为此类函数的参考
void Deck::selectedSlideOperations(Slide &obj,int choice)
{
switch(choice)
{
case 5:
ChangeSlideItemProperties(obj);
break;
} }
在ChangeSlideItemProperties中,我再次将对象作为参考
void Deck::ChangeSlideItemProperties(Slide &obj)
{
for(auto p=obj.getSlideElemnt().begin();p!=obj.getSlideElemnt().end();p++)
{
std::cout<<"before \n";
p->PrintItemProperties();
p->RotateItem(input);
std::cout<<"\nafter \n";
p->PrintItemProperties();
}
}
在此我要迭代Slide对象的slide元素(它是一个向量),并尝试为vector中的所有元素修改成员“ Rotate”的值。 修改后,当我打印“之前”和“之后”成员时,该值正确反映了成员Rotate。 但是,修改后,当我退出此菜单并使用“迭代部分”中所示的迭代方式打印幻灯片元素时,所有成员的值均为0。
我对C ++还是很陌生,请忍受...。我不确定我在这里缺少什么。
编辑:抱歉,我将幻灯片元素更改为list而不是vector,所以我只有列表而没有vectors
编辑2:添加最少的可复制示例
using namespace std;
class Itemprop
{
int Rotate;
public:
Itemprop():Rotate{0}{}
void Set_Rotate(int val)
{
Rotate = val;
}
int Get_Rotate()const
{
return Rotate;
}
};
class Dummy
{
public:
Dummy();
list<Itemprop>& getList(void)
{
return v;
}
virtual ~Dummy();
protected:
private:
list<Itemprop> v;
};
int main()
{
Dummy dobj;
Itemprop iobj;
iobj.Set_Rotate(1);
dobj.getList().emplace_back(iobj);
Itemprop iobj2;
iobj2.Set_Rotate(2);
dobj.getList().emplace_back(iobj2);
for(auto p:dobj.getList())
{
cout<<"before\n";
cout<<p.Get_Rotate()<<endl;
p.Set_Rotate(3);
cout<<"after\n";
cout<<p.Get_Rotate()<<endl;
}
for(auto p:dobj.getList())
{
cout<<p.Get_Rotate()<<"<--new\n";
}
输出为
before
1
after
3
before
2
after
3
1<--new
2<--new
解决方法
因为使用auto
关键字的范围循环通过复制获取列表的元素(列表本身是通过引用获取的)。
快速解决方案是也通过引用来获取元素,例如:
for(auto& p:dobj.getList())
或者您也可以使用std::list
迭代器,就像之前发布的代码一样:
for(auto it = dobj.getList().begin(); it != dobj.getList().end(); it++)
{
cout<<"before\n";
cout<<it->Get_Rotate()<<endl;
it->Set_Rotate(3);
cout<<"after\n";
cout<<it->Get_Rotate()<<endl;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。