2015-07-22 32 views
2

也許我被燒掉了,但我無法弄清楚爲什麼每次運行此代碼時,getInfo函數都不會將cin數據寫入MovieData結構。功能沒有保存到結構

#include <iostream> 
#include <string> 
using namespace std; 

struct MovieData { 
    string Title, Director, Year_Released, RunningTime; 
}; 

MovieData film1; 
MovieData film2; 

void getInfo(MovieData something) 
{ 
    cout << "Please enter...\n"; 
    cout << "Title: "; 
    cin >> something.Title; 
    cout << "Director: "; 
    cin >> something.Director; 
    cout << "Year Released: "; 
    cin >> something.Year_Released; 
    cout << "Running Time: "; 
    cin >> something.RunningTime; 
} 

void showInfo(MovieData something1) 
{ 
    cout << something1.Title << endl; 
    cout << something1.Director << endl; 
    cout << something1.Year_Released << endl; 
    cout << something1.RunningTime << endl; 
    cin.get(); 
    cin.get(); 
} 



int main() 
{ 
    getInfo(film1); 
    showInfo(film1); 
    cin.get(); 
    cin.get(); 
    return 0; 
} 

我不知道這是否是某種全局/局部問題,它似乎如果我必須手動在主函數中的每個獲取信息行才起作用。

+0

你永遠不會從'getInfo'返回任何東西所以要麼讓函數返回變量'something'或者通過引用而不是按值調用函數'getInfo'(我認爲後者會是一個更好的解決方案 – JackV

+0

我推薦閱讀上「通過引用」與「通過價值傳遞」。「理解這兩個基本概念很重要。http://www.cs.fsu.edu/~myers/c++/notes/references.html – Alan

+0

@JackV爲什麼你認爲通過引用比返回值更好的解決方案? –

回答

5

如果更改的getInfo來

void getInfo(MovieData& something) 

聲明(注意添加&)它應該工作。問題是您按值傳遞something,並且您想通過引用傳遞它。

當您使用當前聲明調用getInfo時,something它只是您傳入的參數的副本。該副本由函數修改,但原始對象保持不變。通過添加將參數的類型更改爲MovieData&,您將通過引用傳遞參數,並且函數內部的修改將反映在原始對象中。

一般來說,在C++如果你需要修改函數參數,你應該通過引用傳遞它們,而不是值。

+3

我更喜歡一個名爲'getX'的函數來返回一些東西 –

0

您按值傳遞MovieDatagetInfo,因此您正在更改函數內的本地副本,並且原始變量未看到更改。

你可以採取一個參考,而不是(MovieData&)修復,但更地道的C++的方法是使用一個返回類型:

MovieData getInfo() 
{ 
    MovieData something; 
    cout << "Please enter...\n"; 
    cout << "Title: "; 
    cin >> something.Title; 
    cout << "Director: "; 
    cin >> something.Director; 
    cout << "Year Released: "; 
    cin >> something.Year_Released; 
    cout << "Running Time: "; 
    cin >> something.RunningTime; 
    return something; 
} 

題外話:這是一般最好避免像全局變量如果可以的話,可以使用film1。在這種情況下,你可以在main函數中定義的變量:

int main() { 
    MovieData film = getInfo(); 
} 
2

您已經發布不會做你期望什麼什麼的原因是按值傳遞something。從本質上講,film1被複制到something,然後你修改該副本,然後複製在該函數結束時被銷燬。 film1從未被觸動。

但是,您可以通過引用來解決該問題,但是,如果getInfo的目標是填充MovieData,那麼爲什麼不返回它而不是修改輸入參數呢?它使得該函數的簽名更加直觀。例如:

MovieData getInfo() 
{ 
    MovieData something 
    cout << "Please enter...\n"; 
    cout << "Title: "; 
    cin >> something.Title; 
    cout << "Director: "; 
    cin >> something.Director; 
    cout << "Year Released: "; 
    cin >> something.Year_Released; 
    cout << "Running Time: "; 
    cin >> something.RunningTime; 

    return something; 
} 

然後在主,你可以

MovieData film1 = getInfo(); 
showInfo(film1); 

這樣,沒有人可以通過一個已經popuplated MovieData到你的函數,並讓它重挫。

+2

我更喜歡'void getInfo(MovieData&);'的方法,但是它本身的優點並不能回答這個問題(你應該解釋爲什麼OP的代碼不做他期望的,然後提供解決方案) – Tas