没有在另一个函数中设置变量引用的问题

时间:2014-02-18 17:20:03

标签: c++ pointers reference

您好我理解为什么在调用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;
}

2 个答案:

答案 0 :(得分:2)

push_back会创建副本,因此当您执行breaks.push_back(mybreak);时,将插入breaks的元素与mybreak不同。

在原始对象上调用changeAdchangeBreak不会更改在相应容器中插入的值。

答案 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] );