2014-02-18 35 views
1

您好我無法理解爲什麼函數調用changeAdBreak()後,「播放」的值仍然是「false」。在另一個函數中沒有設置變量引用的問題

在每個函數中,我使用了一個引用參數來修改main()函數內部創建的對象。

但是,當此對象傳遞給函數時,由於某種原因,「播放」屬性不會被設置。

#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

push_back將創建副本,所以當你breaks.push_back(mybreak);,將被插入到breaks元素是一個不同的人比mybreak

對原始對象調用changeAdchangeBreak將不會更改插入到相應容器中的值。

+0

非常感謝你! – codeshark

1

向量中斷定義爲

vector<AllVideos> breaks; 

這種說法

breaks.push_back(mybreak); 

後含有copy對象的mybreak。所以現在你有兩個AllVideos類型的對象:一個名爲mybreak,另一個在向量中。他們佔據不同的記憶。

調用函數changeAdBreak

changeAdBreak(mybreak); 

你改變了對象mybreak但在向量中斷的目標是不變的,你outputed它的數據成員發揮

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]); 
相關問題