函数不保存到结构中

Function not saving to structure

本文关键字:结构 保存 函数      更新时间:2023-10-16

也许我已经筋疲力尽了,但我不明白为什么每次我运行这段代码时,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++中,如果你需要修改函数参数,你应该通过引用传递它们,而不是值。

你所发布的原因不做你所期望的是因为你通过值传递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传递到您的函数中并使其遭到破坏。

您正在通过值将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();
}