2015-07-22 33 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