功能没有保存到结构
也许我被烧掉了,但我无法弄清楚为什么每次运行此代码时,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;
}
我不知道这是否是某种全局/局部问题,它似乎如果我必须手动在主函数中的每个获取信息行才起作用。
如果更改的getInfo来
void getInfo(MovieData& something)
声明(注意添加&
)它应该工作。问题是您按值传递something
,并且您想通过引用传递它。
当您使用当前声明调用getInfo
时,something
它只是您传入的参数的副本。该副本由函数修改,但原始对象保持不变。通过添加将参数的类型更改为MovieData&
,您将通过引用传递参数,并且函数内部的修改将反映在原始对象中。
一般来说,在C++
如果你需要修改函数参数,你应该通过引用传递它们,而不是值。
我更喜欢一个名为'getX'的函数来返回一些东西 –
您按值传递MovieData
至getInfo
,因此您正在更改函数内的本地副本,并且原始变量未看到更改。
你可以采取一个参考,而不是(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();
}
您已经发布不会做你期望什么什么的原因是按值传递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
到你的函数,并让它重挫。
我更喜欢'void getInfo(MovieData&);'的方法,但是它本身的优点并不能回答这个问题(你应该解释为什么OP的代码不做他期望的,然后提供解决方案) – Tas
你永远不会从'getInfo'返回任何东西所以要么让函数返回变量'something'或者通过引用而不是按值调用函数'getInfo'(我认为后者会是一个更好的解决方案 – JackV
我推荐阅读上“通过引用”与“通过价值传递”。“理解这两个基本概念很重要。http://www.cs.fsu.edu/~myers/c++/notes/references.html – Alan
@JackV为什么你认为通过引用比返回值更好的解决方案? –