结构新手,我对如何从 void 函数中返回值并将其放入另一个函数感到困惑

New to structures, I'm confused about how to return values out of a void function and put it into another function

本文关键字:函数 另一个 新手 结构 void 返回值      更新时间:2023-10-16

我的C++班刚刚开始学习开发结构。我被困在一个家庭作业问题上,要求我编写一个程序,该程序使用名为movie_data的结构和两个movie_data变量来显示有关电影的信息。我能够正确开发movie_data结构以及两个变量,以输出名为 get_movie_info 的函数。但是,由于我将其设置为 void 函数,因此无法返回get_movie_function生成的任何内容以发送到我的movie_display函数。我尝试将我的函数重写为movie_data结构数据类型,但这似乎使事情变得更糟。第一个函数正确生成所有信息,但第二个函数不输出任何内容。谢谢你的时间。

#include <iostream>
#include <iomanip>
using namespace std;

struct movie_data
{
string title;
string director;
int year_released;
int running_time;
};
//Function Prototype
void get_movie_info(movie_data movie1, movie_data movie2);
void movie_display(movie_data movie1, movie_data movie2);
int main()
{
movie_data movie1;
movie_data movie2;
get_movie_info(movie1, movie2);
movie_display(movie1, movie2);
return 0;
}
void get_movie_info(movie_data movie1, movie_data movie2)
{
//Get movie_data's title
cout << "Enter the title for the first movie: ";
//cin.ignore();
getline(cin, movie1.title);
cout << movie1.title << endl;
//Get movie_data's director
cout << "Enter the director's name for " << movie1.title << ": ";
//cin.ignore();
getline(cin, movie1.director);
cout << movie1.director << endl;
//Get movie_data's release year
cout << "Enter the release year for " << movie1.title << ": ";
cin >> movie1.year_released;
cout << movie1.year_released << endl;
//Get movie_data's running time
cout << "Enter the runtime of " << movie1.title << " in minutes: ";
cin >> movie1.running_time;
cout << movie1.running_time << " minutes" << endl;
//Get movie_data's title
cout << "Enter the title for the second movie: ";
cin.ignore();
getline(cin, movie2.title);
cout << movie2.title << endl;
//Get movie_data's director
cout << "Enter the director's name for " << movie2.title << ": ";
//cin.ignore();
getline(cin, movie2.director);
cout << movie2.director << endl;
//Get movie_data's release year
cout << "Enter the release year for " << movie2.title << ": ";
cin >> movie2.year_released;
cout << movie2.year_released << endl;
//Get movie_data's running time
cout << "Enter the runtime of " << movie2.title << " in minutes: ";
cin >> movie2.running_time;
cout << movie2.running_time << " minutes" << endl;
}
void movie_display(movie_data movie1, movie_data movie2)
{
//Display movie1 information
cout << "nBelow is the data of the first movie:n";
cout << "Movie Title:  " << movie1.title << endl;
cout << "Director's Name:  " << movie1.director << endl;
cout << "Release Year:  " << movie1.year_released << endl;
cout << "Movie Runtime in minutes:  " << movie1.running_time << endl;
//Display the movie information
cout << "nBelow is the data of the second movie:n";
cout << "Movie Title:  " << movie2.title << endl;
cout << "Director's Name:  " << movie2.director << endl;
cout << "Release Year:  " << movie2.year_released << endl;
cout << "Movie Runtime in minutes:  " << movie2.running_time << endl;

}

虽然@Kai使用引用的答案会起作用并且会正确回答您最初的问题,但我建议做其他事情。

首先,使用一个函数只读取一个move_data并使其返回:

movie_data get_movie_info();

可能的实现(使用您的代码(可能是这样的:

movie_data get_movie_info(){
movie_data movie; 
cout << "Enter the title for the first movie: ";
getline(cin, movie.title);
cout << "Enter the director's name for " << movie.title << ": ";
getline(cin, movie.director);
cout << "Enter the release year for " << movie.title << ": ";
cin >> movie.year_released;
cout << "Enter the runtime of " << movie.title << " in minutes: ";
cin >> movie.running_time;
return movie;
}

现在,您可以调用它两次来读取您的信息,它将以正确的结构返回电影数据。

movie_data movie1 = get_movie_data();

如果需要具有可编辑的结构,引用是一个不错的选择。对于返回多个值,有更好的选择:合适大小的数组 (std::array(、两个对或对象向量。

最好避免使用输出参数(根据经验,如果需要并知道原因,请将其打破(,因为它们很难从签名中掌握并且难以跟踪。

请注意,您执行所有操作两次。使用函数的要点是不要对所有事情都做两次,所以你应该写一个函数来做一件事,然后用不同的参数调用它。例如在get_movie_info.更好的设计是创建一个函数,该函数只创建一个movie_data并返回它:

movie_data get_movie_info()
{
movie_data result = {}; // That's the variable were we store the data
//Get movie_data's title ...
//Get movie_data's director ...
//Get movie_data's release year ... 
//Get movie_data's running time ...
return result; // return the created movie data
}

movie_display也是如此.不要创建一个对两个参数执行完全相同操作的函数,而是创建一个执行一次并调用两次的函数:

void movie_display(movie_data movie)
{
cout << "Movie Title:  " << movie.title << endl;
//And so on ...
}

然后,您将两者组合在main中,如下所示:

int main()
{
movie_data movie1 = get_movie_info();
movie_data movie2 = get_movie_info();
std::cout << "data of the first movie:n";
movie_display(movie1);
std::cout << "data of the second movie:n";
movie_display(movie2);
return 0;
}

更新函数签名以采用引用而不是值。

https://www.learncpp.com/cpp-tutorial/72-passing-arguments-by-value/

void get_movie_info(movie_data& movie1, movie_data& movie2)
void movie_display(const movie_data& movie1, const movie_data& movie2)