您好我理解为什么在调用changeAdBreak()
函数后,“播放”的值仍然是“假”。
在每个函数中,我使用了一个引用参数来修改main()函数内部创建的对象。
但是,当此对象传递给函数时,“playing”属性由于某种原因未设置。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Video{
public:
bool played;
};
class AllVideos{
public:
vector<Video> ads;
};
void changeAd(Video& ad)
{
ad.played = true;
}
void changeAdBreak(AllVideos& mybreak)
{
changeAd(mybreak.ads[0]);
}
int main()
{
AllVideos mybreak;
Video my_ad;
my_ad.played = false;
mybreak.ads.push_back(my_ad);
vector<AllVideos> breaks;
breaks.push_back(mybreak);
cout << "ad played = " << breaks[0].ads[0].played << endl;
changeAdBreak(mybreak);
cout << "ad played = " << breaks[0].ads[0].played << endl;
return 1;
}
答案 0 :(得分:2)
push_back
会创建副本,因此当您执行breaks.push_back(mybreak);
时,将插入breaks
的元素与mybreak
不同。
在原始对象上调用changeAd
或changeBreak
不会更改在相应容器中插入的值。
答案 1 :(得分:1)
矢量中断定义为
vector<AllVideos> breaks;
在此声明之后
breaks.push_back(mybreak);
包含copy
对象mybreak。所以现在你有两个AllVideos类型的对象:一个名为mybreak,另一个名为矢量中断。他们占据了不同的记忆。
调用函数changeAdBreak
changeAdBreak(mybreak);
你更改了对象mybreak,但是向量中断的对象没有改变,你输出了数据成员
cout << "ad played = " << breaks[0].ads[0].played << endl;
当然包含其未更改的值。
在此确定添加一个语句并比较它们的输出
cout << "ad played = " << breaks[0].ads[0].played << endl;
cout << "ad played = " << mybreak.ads[0].played << endl;
要更改向量中断中的对象,您应该将函数changeAdBreak称为
changeAdBreak( breaks[0] );