home *** CD-ROM | disk | FTP | other *** search
/ C++ for Dummies (3rd Edition) / C_FD.iso / CHAP24 / CHAP24_1.CPP
C/C++ Source or Header  |  1996-09-15  |  2KB  |  88 lines

  1. // Chap24_1.cpp - notice that this program should die
  2. //                a miserable death; see main() for details
  3. #include <iostream.h>
  4. #include <iomanip.h>
  5. class USDollar
  6. {
  7.   public:
  8.    USDollar(double v = 0.0)
  9.    {
  10.       dollars = v;
  11.       cents = int((v - dollars) * 100.0 + 0.5);
  12.       signature = 0x1234;    //itÆs a valid object now
  13.    }
  14.   ~USDollar()
  15.    {
  16.       if (isLegal("destructor"))
  17.       {
  18.          signature = 0;      //itÆs no longer a valid object
  19.       }
  20.    }
  21.    operator double()
  22.    {
  23.       if (isLegal("double"))
  24.       {
  25.          return dollars + cents / 100.0;
  26.       }
  27.       else
  28.       {
  29.          return 0.0;
  30.       }
  31.    }
  32.    void display(ostream& out)
  33.    {
  34.       if (isLegal("display"))
  35.       {
  36.          out << '$' << dollars << '.'
  37.              << setfill('0') << setw(2) << cents
  38.              << setfill(' ');
  39.       }
  40.    }
  41.    int isLegal(char *pFunc);
  42.   protected:
  43.    unsigned int signature;
  44.    unsigned int dollars;
  45.    unsigned int cents;
  46. };
  47. //isLegal - check the signature field. If it doesnÆt
  48. //          check out, generate error and return indicator
  49. int USDollar::isLegal(char *pFunc)
  50. {
  51.    if (signature != 0x1234)
  52.    {
  53.       cerr << "\nInvalid USDollar object address passed to "
  54.            << pFunc
  55.            << "\n";
  56.       return 0;
  57.    }
  58.    return 1;
  59. }
  60. ostream& operator<< (ostream& o, USDollar& d)
  61. {
  62.    d.display(o);
  63.    return o;
  64. }
  65.  
  66. void printSalesTax(USDollar &amount)
  67. {
  68.    cout << "Tax on "
  69.         << amount
  70.         << " = "
  71.         << USDollar(0.0825 * amount)
  72.         << "\n";
  73. }
  74. int main()
  75. {
  76.    cout << "First case\n";
  77.    USDollar usd(1.50);
  78.    printSalesTax(usd);
  79.    cout << "\n";
  80.  
  81.    // this case should cause the program to crash since
  82.    // pUSD is not initialized to a legal object
  83.    cout << "Second case\n";
  84.    USDollar *pUSD;
  85.    printSalesTax(*pUSD);
  86.    return 0;
  87. }
  88.