也许我已经烧坏了,但我无法弄清楚为什么每次运行此代码时,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 :(得分:5)
如果将getInfo的声明更改为
void getInfo(MovieData& something)
(注意添加的&
)它应该有效。问题是您要按值something
传递,并希望通过引用传递它。
当您使用当前声明调用getInfo
时,它获取的something
只是您传入的参数的副本。该副本由函数修改,但原始对象保持不变。通过添加将参数类型更改为MovieData&
,您将通过引用传递参数,并且函数内部的修改将反映在原始对象中。
一般来说,在C++
中,如果你需要修改函数参数,你应该通过引用传递它们,而不是值。
答案 1 :(得分: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;
}
然后在main中,你可以
MovieData film1 = getInfo();
showInfo(film1);
这样一来,没有人可以将已经普及的MovieData
传递给你的函数并让它破坏。
答案 2 :(得分:0)
您正在通过值将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();
}