功能不保存到结构
Function not saving to structure
也许我已经筋疲力尽了,但我无法弄清楚为什么每次我 运行 这段代码时,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;
}
我不知道这是否是某种 global/local 问题,它似乎只有在我在主函数中手动设置每个获取信息行时才有效。
如果将 getInfo 的声明更改为
void getInfo(MovieData& something)
(注意添加的 &
)它应该可以工作。问题是您正在按值传递 something
并且您想通过引用传递它。
当您使用当前声明调用 getInfo
时,它获得的 something
只是您传入的参数的副本。该副本由函数修改,但原始对象保持不变相同的。通过将参数类型更改为 MovieData&
,您将通过引用传递参数,并且函数内部的修改将反映在原始对象中。
一般来说,在 C++
中,如果您需要修改函数参数,您应该通过引用而不是值来传递它们。
您正在按值将 MovieData
传递给 getInfo
,因此您正在更改函数内的本地副本,而原始变量看不到更改。
您可以通过引用来修复它 (MovieData&
),但更惯用的 C++ 方法是使用 return 类型:
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
,为什么不 return 它而不是修改你的输入参数?它使函数的签名更加直观。例如:
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
传递到您的函数中并破坏它。
也许我已经筋疲力尽了,但我无法弄清楚为什么每次我 运行 这段代码时,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;
}
我不知道这是否是某种 global/local 问题,它似乎只有在我在主函数中手动设置每个获取信息行时才有效。
如果将 getInfo 的声明更改为
void getInfo(MovieData& something)
(注意添加的 &
)它应该可以工作。问题是您正在按值传递 something
并且您想通过引用传递它。
当您使用当前声明调用 getInfo
时,它获得的 something
只是您传入的参数的副本。该副本由函数修改,但原始对象保持不变相同的。通过将参数类型更改为 MovieData&
,您将通过引用传递参数,并且函数内部的修改将反映在原始对象中。
一般来说,在 C++
中,如果您需要修改函数参数,您应该通过引用而不是值来传递它们。
您正在按值将 MovieData
传递给 getInfo
,因此您正在更改函数内的本地副本,而原始变量看不到更改。
您可以通过引用来修复它 (MovieData&
),但更惯用的 C++ 方法是使用 return 类型:
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
,为什么不 return 它而不是修改你的输入参数?它使函数的签名更加直观。例如:
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
传递到您的函数中并破坏它。