Back to slide -- Keyboard shortcut: 'u'  previous -- Keyboard shortcut: 'p'  next -- Keyboard shortcut: 'n'          references/ref-fields.cc - Convenient references to long/deep fields.Lecture 2 - slide 15 : 29
Program 7

// Illustrates how a reference can be used for naming convenience.
// A program with two versions of the function work_on_persons_road_number.

#include <iostream>
#include <string>

using namespace std;

typedef struct{
  char road[15];
  int roadNumber;
  char town[20];
  } address;   

typedef struct{
  int idNumber;
  char firstName[10],
       lastName[20];
  address location;} person;   

bool even(int n){
  return n%2 == 0;
}

// A function in which a long and deep field name is used many times.
void work_on_persons_road_number(person &p){
  if (even(p.location.roadNumber))
    p.location.roadNumber = p.location.roadNumber + 1;
  else
    p.location.roadNumber = 0;
}

// A version of the function that binds the roadNumber field to an
// int reference.
void work_on_persons_road_number_with_ref(person &p){
  int &lrn = p.location.roadNumber;
  if (even(lrn))
    lrn = lrn + 1;
  else
    lrn = 0;
}

void print_person(person &p){
  cout << p.firstName << " " << p.lastName << endl
       << p.location.road << " " << p.location.roadNumber << endl
       << p.location.town << endl << endl;
}
 
int main(){
  person morten = 
     {190583,                             /* Initializer      */
      "Morten", "Madsen",                 /* and only that... */
      {"Bredgade", 23, "Middelfart"}
     };

  print_person(morten);
  work_on_persons_road_number(morten);
  print_person(morten);
  work_on_persons_road_number_with_ref(morten);
  print_person(morten);
}