#ifndef cd_H_
#define cd_H_
#include <string>
#include <iostream>
#include <cstring>
#pragma warning(disable:4996)
using std:: cout;
class Cd {
private :
char * performers;
char * label;
int selections;
double playtime;
public :
Cd ( const char * s1, const char * s2, int n, double x) ;
Cd ( ) ;
virtual ~ Cd ( ) ;
virtual void Report ( ) const ;
Cd& operator = ( const Cd& d) ;
} ;
class Classic : public Cd
{
private :
char * works;
public :
Classic ( const char * s1, const char * s2, const char * s3, int n, double x) ;
Classic ( ) : Cd ( ) {
}
virtual ~ Classic ( ) ;
virtual void Report ( ) const ;
Classic& operator = ( const Classic& d) ;
} ;
#endif
#include <iostream>
#include "diyi.h"
Cd:: Cd ( const char * s1, const char * s2, int n, double x)
{
performers = new char [ std:: strlen ( s1) + 1 ] ;
std:: strcpy ( performers, s1) ;
label = new char [ std:: strlen ( s2) + 1 ] ;
std:: strcpy ( label, s2) ;
selections = n;
playtime = x;
}
Cd:: Cd ( )
{
performers = 0 ;
label = 0 ;
selections = 0 ;
playtime = 0.0 ;
}
Cd:: ~ Cd ( )
{
delete [ ] performers;
delete [ ] label;
}
void Cd:: Report ( ) const
{
cout << "performers: " << performers << '\n' ;
cout << "label: " << label << '\n' ;
cout << "selections: " << selections << '\n' ;
cout << "playtime: " << playtime << '\n' ;
}
Cd& Cd:: operator = ( const Cd& d)
{
if ( this == & d)
return * this ;
delete [ ] performers;
delete [ ] label;
performers = new char [ std:: strlen ( d. performers) + 1 ] ;
std:: strcpy ( performers, d. performers) ;
label = new char [ std:: strlen ( d. label) + 1 ] ;
std:: strcpy ( label, d. label) ;
selections = d. selections;
playtime = d. playtime;
return * this ;
}
Classic:: Classic ( const char * s1, const char * s2, const char * s3, int n, double x) : Cd ( s2, s3, n, x)
{
works = new char [ std:: strlen ( s1) + 1 ] ;
std:: strcpy ( works, s1) ;
}
void Classic:: Report ( ) const
{
cout << "works: " << works << '\n' ;
Cd:: Report ( ) ;
}
Classic:: ~ Classic ( )
{
delete [ ] works;
}
Classic& Classic:: operator = ( const Classic& d)
{
if ( this == & d)
{
return * this ;
}
Cd:: operator = ( d) ;
delete [ ] works;
works = new char [ std:: strlen ( d. works) + 1 ] ;
std:: strcpy ( works, d. works) ;
return * this ;
}
#include "diyi.h"
using namespace std;
void Bravo ( const Cd& disk) ;
int main ( )
{
Cd c1 ( "Beatles" , "Capitol" , 14 , 35.5 ) ;
Classic c2 = Classic ( "Piano Sonata in B flat, Fantasia in C" ,
"Alfred Brendel" , "Philips" , 2 , 57.17 ) ;
Cd* pcd = & c1;
cout << "Using object directly:\n" ;
c1. Report ( ) ;
c2. Report ( ) ;
cout << "Using type cd * pointer to objects:\n" ;
pcd- > Report ( ) ;
pcd = & c2;
pcd- > Report ( ) ;
cout << "Calling a function with a Cd reference argument:\n" ;
Bravo ( c1) ;
Bravo ( c2) ;
cout << "Testing assignment: " ;
Classic Copy;
Copy = c2;
Copy. Report ( ) ;
return 0 ;
}
void Bravo ( const Cd& disk)
{
disk. Report ( ) ;
}