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