功能未保存到结构

时间:2015-07-22 01:25:14

标签: c++ function 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;
}

我不知道这是否是某种全局/本地问题,如果我在主函数中手动获取每条获取信息行,它似乎只能起作用。

3 个答案:

答案 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();
}