Passing structures by value makes the most sense when the structure is relatively compact, so let’s look at a couple examples along those lines. The first example deals with travel time (not to be confused with time travel). Some maps will tell you that it is 3 hours, 50 minutes, from Thunder Falls to Bingo City and 1 hour, 25 minutes, from Bingo City to Grotesquo. You can use a structure to represent such times, using one member for the hour value and a second member for the minute value. Adding two times is a little tricky because you might have to transfer some of the minutes to the hours part. For example, the two preceding times sum to 4 hours, 75 minutes, which should be converted to 5 hours, 15 minutes. Let’s develop a structure to represent a time value and then a function that takes two such structures as arguments and returns a structure that represents their sum.
Defining the structure is simple:
struct travel_time
{
int hours;
int mins;
};
Next, consider the prototype for a sum()
function that returns the sum of two such structures. The return value should be type travel_time
, and so should the two arguments. Thus, the prototype should look like this:
travel_time sum(travel_time t1, travel_time t2);
To add two times, you first add the minute members. Integer division by 60 yields the number of hours to carry over, and the modulus operation (%
) yields the number of minutes left. Listing 7.11 incorporates this approach into the sum()
function and adds a show_time()
function to display the contents of a travel_time
structure.
// travel.cpp -- using structures with functions
#include <iostream>
struct travel_time
{
int hours;
int mins;
};
const int Mins_per_hr = 60;
travel_time sum(travel_time t1, travel_time t2);
void show_time(travel_time t);
int main()
{
using namespace std;
travel_time day1 = {5, 45}; // 5 hrs, 45 min
travel_time day2 = {4, 55}; // 4 hrs, 55 min
travel_time trip = sum(day1, day2);
cout << "Two-day total: ";
show_time(trip);
travel_time day3= {4, 32};
cout << "Three-day total: ";
show_time(sum(trip, day3));
return 0;
}
travel_time sum(travel_time t1, travel_time t2)
{
travel_time total;
total.mins = (t1.mins + t2.mins) % Mins_per_hr;
total.hours = t1.hours + t2.hours +
(t1.mins + t2.mins) / Mins_per_hr;
return total;
}
void show_time(travel_time t)
{
using namespace std;
cout << t.hours << " hours, "
<< t.mins << " minutes
";
}
Here travel_time
acts just like a standard type name; you can use it to declare variables, function return types, and function argument types. Because variables such as total
and t1
are travel_time
structures, you can apply the dot membership operator to them. Note that because the sum()
function returns a travel_time
structure, you can use it as an argument for the show_time()
function. Because C++ functions, by default, pass arguments by value, the show_time(sum(trip, day3))
function call first evaluates the sum(trip, day3)
function call in order to find its return value. The show_time()
call then passes sum()
’s return value, not the function itself, to show_time()
. Here’s the output of the program in Listing 7.11:
Two-day total: 10 hours, 40 minutes
Three-day total: 15 hours, 12 minutes
3.16.212.217