Previous Page TOC Next Page



- Project 10 -
Object-Oriented Programming


In this lesson, you learned about how a class is defined, and you covered the basic features of all C++ classes. You learned about these features of classes:

Project Listing 10. A simple class-based program.


  1:// File name: PROJCT10.CPP

  2:// An OOP program to list favorite radio stations

  3://

  4:#include <iostream.h>

  5:#include <string.h>

  6:

  7://************************************************************

  8:// String - a class to manage strings

  9://

 10:class String

 11:  {

 12:    public:

 13:      // Constructors

 14:      String();                       // Default

 15:      String(const String& n);        // Copy

 16:      String(const char * newString); // Normal

 17:      // Destructor

 18:      ~String();

 19:      // Access functions

 20:      const char * Get() const;

 21:      void Set(const char * newString);

 22:      int Length() const;

 23:    private:

 24:      // Data member

 25:      char * string;

 26:  };

 27:

 28:// Default constructor - ensure string is initialized

 29:String::String()

 30:  {

 31:    string = 0;

 32:  }

 33:

 34:// Copy constructor - ensure string is duplicated

 35:String::String(const String& n)

 36:  {

 37:    if (n.string)

 38:      {

 39:         string = new char[strlen(n.string) + 1];

 40:         strcpy(string,n.string);

 41:      }

 42:    else

 43:      string = 0;

 44:  }

 45:

 46:// Make a string from C string

 47:String::String(const char * newString)

 48:  {

 49:    if (newString)

 50:      {

 51:         string = new char[strlen(newString) + 1];

 52:         strcpy(string,newString);

 53:      }

 54:    else

 55:      string = 0;

 56:  }

 57:

 58:// Destructor

 59:String::~String()

 60:  {

 61:    delete [] string;

 62:  }

 63:

 64:// Provide access to stored string

 65:const char * String::Get() const

 66:  {

 67:    return string;

 68:  }

 69:// Replace contents with new string

 70:void String::Set(const char * newString)

 71:  {

 72:    delete [] string;

 73:    if (newString)

 74:      {

 75:         string = new char[strlen(newString) + 1];

 76:         strcpy(string,newString);

 77:      }

 78:    else

 79:      string = 0;

 80:  }

 81:// Get length of stored string

 82:int String::Length() const

 83:  {

 84:    if (!string)

 85:      return 0;

 86:    return strlen(string);

 87:  }

 88://************************************************************

 89://

 90://

 91:class RadioStation

 92:  {

 93:    public:

 94:      RadioStation(const char * Name, const char * City,

 95:                  float Frequency);

 96:      void Print() const;

 97:    private:

 98:      String name;

 99:      String city;

100:      float  frequency;

101:  };

102:

103:RadioStation::RadioStation(const char * Name, const char * City,

104:                  float Frequency)

105:             : name(Name),

106:               city(City),

107:               frequency(Frequency)

108:  {

109:  }

110:

111:void RadioStation::Print() const

112:  {

113:    int i;

114:    cout << name.Get();

115:    // Line up printout

116:    for (i = name.Length(); i < 20; i++)

117:      cout << ' ';

118:    cout << city.Get();

119:    for (i = city.Length(); i < 20; i++)

120:      cout << ' ';

121:    cout.precision(2);        // NB cout is a class

122:                              // precision is a function

123:    cout.setf(ios::showpoint);// as is setf

124:    cout.setf(ios::fixed);

125:    cout.width(6);

126:    cout << frequency;

127:  }

128://************************************************************

129:// Some global functions (they are still allowed in OOP!)

130://

131:int MoreInput();

132:RadioStation* NewRadioStation();

133:void PrintTitle();

134://************************************************************

135:// The main function

136://

137:void main()

138:  {

139:     RadioStation* stations[20]; // There are better ways to

140:                                 // store lists, but this is

141:                                 // good enough for this example

142:     int count = 0;

143:     while (MoreInput())

144:       {

145:          stations[count] = NewRadioStation();

146:          if (!stations[count])

147:            cout << "*** Error! Input rejected! ***" << endl;

148:          else

149:            count++;

150:       }

151:

152:     PrintTitle();               // Should this be global or part

153:                                 // of RadioStation?

154:

155:     for (int i = 0; i < count; i++)

156:       {

157:          stations[i]->Print();  // Call member function via pointer

158:          cout << endl;

159:          delete stations[i];

160:       }

161:   }

162:

163://************************************************************

164:// Globals

165://

166:int MoreInput()

167:  {

168:    char temp;

169:    cout << endl << endl << "Do you want to add more stations? ";

170:    cin >> temp;

171:    cin.ignore();

172:    if (temp == 'y' || temp == 'Y')

173:      return 1;

174:    else

175:      return 0;

176:  }

177:

178:RadioStation* NewRadioStation()

179:  {

180:    char tempName[81];

181:    char tempCity[81];

182:    float tempFrequency;

183:    cout << endl << "Name: ";

184:    cin.getline(tempName,81);

185:    if (strlen(tempName) == 0)

186:      return 0;

187:    cout << "City: ";

188:    cin.getline(tempCity,81);

189:    if (strlen(tempCity) == 0)

190:      return 0;

191:    cout << "Frequency : ";

192:    cin >> tempFrequency;

193:    cin.ignore(80,'\n');

194:    if (tempFrequency < 0)

195:      return 0;

196:    return new RadioStation(tempName,tempCity,tempFrequency);

197:  }

198:

199:void PrintTitle()

200:  {

201:    cout << endl << "--------------------";

202:    cout << "--------------------";

203:    cout << "-----------" << endl;

204:    cout << "Station             ";

205:    cout << "City                ";

206:    cout << "Frequency" << endl;

207:  }

Output

Description

1: A comment to identify the program source file.

2: A comment to describe the program's purpose.

3: Empty comments enhance the appearance of the program.

4: Include the header for the cout functions.

5: Include the header required for strcpy and strlen().

6: Blank lines make the program more readable.

7: A bold comment separates each class.

8: A comment to describe the following class.

9: Empty comments enhance the appearance of the code.

10: Declare a class called String.

11: All class definitions start with an opening brace.

12: All members following this label will be public.

13: A comment to identify the following functions.

14: A default constructor is declared.

15: A copy constructor, which takes a reference to its own class.

16: A general constructor.

17: Comment to identify following functions.

18: The ~ in front of the class name and no return type identifies this function as a destructor.

19: Comment to identify following functions.

20: Get() is provided solely to access a private data member safely.

21: A function Set will be provided in this class, and a definition will follow.

22: An information function that provides the length of the string.

23: All members following this label will be public.

24: A comment to identify the following definition.

25: A pointer to a character string is defined as a class data member.

26: All class definitions end with a closing brace and a semicolon.

27: Blank lines help to make the program more readable.

28: A comment to identify the following function.

29: This line identifies that a member function of String is to be defined and that the function is the default constructor.

30: All functions start with an opening brace.

31: Ensure that the pointer is marked with zero for empty.

32: All functions end with a closing brace.

33: Blank lines make the code more readable.

34: A comment to describe the following code.

35: The definition of the class copy constructor starts.

36: All functions start with an opening brace.

37: If the passed string to be copied contains data, do the following:

38: Start a compound statement with an opening brace.

39: Create a new character array as long as the string to be copied plus an extra character for the terminator.

40: Copy the actual string into the new class storage.

41: End a compound statement with a closing brace.

42: If the string pointer does not point to data, do the following.

43: Set the new string pointer to zero so that C++ can later identifiy that no memory is allocated to this pointer.

44: Function definitions always end with a closing brace.

45: Blank lines make the program more readable.

46: A comment to describe the following function.

47: Define the class constructor that accepts a const char* parameter.

48: All functions start with an opening brace.

49: If a non-zero string is passed, do the following:

50: Compound statements start with an opening brace.

51: Create a new character storage that is long enough to contain the string passed in.

52: Copy the string.

53: Compound statements end with a closing brace.

54: If the string pointer does not point to data, do the following.

55: Set the new string pointer to zero so that C++ can later identifiy that no memory is allocated to this pointer.

56: All functions end with a closing brace.

57: Blank lines help to make the program more readable.

58: A comment to describe the following function.

59: A function with the same name as the class name and a ~ in front declares a destructor.

60: Function definitions always start with an opening brace.

61: An array is deleted with the array deletion operator.

62: C++ functions are typically very short, as this closing brace shows.

63: Blank lines make the program more readable.

64: Comments explain the actions of the code

65: Define a function that retrieves a pointer to a string that cannot be used to update.

66: All function definitions start with an opening brace.

67: Returning a non-const value causes the return value to be automatically cast into const by the compiler.

68: All functions end with a closing brace.

69: Use comments to explain the workings of the code.

70: Define a function with no return value, which accepts a literal (or variable) string.

71: All functions start with an opening brace.

72: Remove the existing contents of the string pointer. delete does not operate on a zero pointer.

73: If the parameter passes an actual string, do the following:

74: Compound statements start with an opening bracket.

75: Create a dynamic allocation as long as the passed string plus the terminator.

76: Copy the parameter into the allocated storage.

77: Compound statements are ended with a closing brace.

78: If no string was passed, a zero pointer is received. Perform the following step.

79: Set the pointer to zero.

80: All functions end with a closing brace.

81: Comment to explain the workings of the program.

82: Declare a function that returns an int and takes no parameters.

83: All functions start with an opening brace.

84: If no string is stored by the class, do the following:

85: Return a zero length, avoiding checking a missing string.

86: Return the length found by a library function.

87: All functions end with a closing brace.

88: A comment helps delimit sections of code.

89: Empty comments can enhance the appearance of the program.

90: Empty comments can enhance the appearance of the program.

91: Declare a class called RadioStation.

92: All class definitions start with an opening brace.

93: All functions following this label will be public.

94: Declare a constructor for the class.

95: Long declarations are best split over a number of lines.

96: Declare a public member function.

97: All members following this label will be private.

98: Declare a member that is a class of your own making.

99: Declare a String data member.

100: Declare a data member of type float.

101: All class definitions end with a closing brace and a semicolon.

102: Blank lines enhance the appearance of the program.

103: Define the radioStation constructor.

104: Long parameter lists are best split over a number of lines.

105: Members are very efficiently initialized using class constructors in an initialization list.

106: Initialize the city String with the String constructor.

107: Standard classes also have constructors that can be directly called.

108: All function definitions must start with an opening brace even though they might do nothing.

109: All function definitions must end with a closing brace even if they do nothing.

110: Blank lines make the program more readable.

111: Define a function that has been declared part of the RadioStation class.

112: All functions start with an opening brace.

113: Declare a variable i for later use.

114: Output a character string obtained from the string name.

115: Comments explain the workings of the program.

116: Do the following statement for the number of characters in the string up to 19.

117: Output a space to line up the list for names of different lengths.

118: Print the city name retrieved from the string member.

119: Do the following statement for the number of characters in the string up to 19.

120: Output a space to line up the list for city names of different lengths.

121: Use built-in class member function of cout to set the number of decimal places printed.

122: Comments explain the working of the program.

123: Ensure that the decimal place is always shown.

124: Stop numbers from being displayed in floating-point format.

125: Limit the number of characters for displaying the number to six.

126: Output the number according to the previous formatting.

127: All functions end with a closing brace.

128: Bold comments help divide the sections of the program.

129: Attempts at witty comments become irritating over time.

130: Blank comments enhance the appearance of your code.

131: Prototype a global function.

132: Prototype a global function.

133: Breaking up large functions into several routines makes the program easier to follow.

134: Bold comments help divide the sections of the program.

135: A comment can title the following code.

136: Blank comments enhance the appearance of your code.

137: Define the main() function where the program starts executing.

138: A function definition always starts with an opening brace.

139: A declaration of an array of 20 RadioStation pointers.

140: A comment to explain the way the program has been coded.

141: A comment to explain the way the program has been coded.

142: A counter to record the number of stations entered.

143: while the user requests further input.

144: Multiple statements repeated by a while loop need to be enclosed in a compound statement.

145: Allocate a new radio station using a function defined later.

146: If the program was not able to allocate a new radio station. . .

147: Report the error to the user.

148: If the program was able to allocate the new radio station. . .

149: Increment the count of successfully added radio stations.

150: This closing brace marks the end of a while loop.

151: Blank lines help to make the program more readable.

152: Call a global routine to output the title of the report.

153: Use comments to note places where the code might be improved in the future.

154: Blank lines help to make the program more readable.

155: For each radio station stored, do the following:

156: Loops requiring multiple statements need compound statements.

157: Call the member function of RadioStation using the pointer access operator.

158: Output a newline sequence.

159: Delete the allocated memory when it is no longer required.

160: The closing brace marks the end of the for loop.

161: Closing braces also mark the end of function definitions.

162: Blank lines make programs more readable.

163: Bold comments separate sections of the program.

164: A comment is used to title the following code.

165: Blank comments can enhance the appearance of your program.

166: Define a global function that returns true (nonzero) or false(zero).

167: Function definitions always start with an opening brace.

168: A variable to test the user input.

169: Prompt the user for an answer with a question.

170: Get the first character of input.

171: Ignore all input after the first character.

172: If the answer is lower- or uppercase Y. . .

173: Return true

174: Otherwise. . .

175: Return false.

176: All function definitions end with a closing brace.

177: Blank lines help to make your programs more readable.

178: Declare a function that returns a pointer to a RadioStation.

179: All function declarations start with an opening brace.

180: Declare a temporary character string big enough for any response.

181: Declare a temporary character string big enough for any response.

182: Declare a temporary variable for the frequency of the station.

183: Prompt the user to enter the name of the station.

184: Get the name of the station.

185: If name is zero length. . .

186: Reject the input.

187: Prompt for city name.

188: Get the city name entered by the user.

189: If name is zero length. . .

190: Reject the input.

191: Prompt the user to enter the frequency.

192: Get the frequency from the user.

193: Ignore any extra characters entered after the user enters the frequency.

194: If frequency is nonsense. . .

195: Reject the input.

196: If the input is acceptable, return a new RadioStation object via a temporary hidden pointer.

197: All functions end with a closing brace.

198: Blank lines make the program more readable.

199: Define the PrintTitle() global function.

200: All function definitions start with an opening brace.

201: Output a newline sequence and text.

202: Output text.

203: Output text and a newline.

204: Output text.

205: Output text.

206: Output text and a newline.

207: All functions end with a closing brace.



14: A constructor can always be identified because it has no return type and has the same name as the class.

16: A constructor that takes a single parameter can also be used as a type converter.

31: A pointer with valid storage can never be zero.

49: When accepting pointers, it is a good idea to check that a value has been passed.

72: delete does not operate on a zero pointer.

79: delete does not reset the pointer to zero.

113: It is a tradition from FORTRAN and BASIC that integer counters are named i.

132: Of course, global functions can still see and use class object definitions.

143: This should test for the array bound. How would you code that?

165: Many libraries of code and new ANSI draft of C++ declare a type BOOL or bool with values of TRUE and FALSE or true and false.

184: Using getline() allows the name to contain blanks.

196: If the function can't allocate memory, zero will be returned.


Previous Page Page Top TOC Next Page