俺刚学的友元函数怎么老编译通不过呢
红色的是问题语句,蓝色的是提示的错误 ___________________________________________________________________________
date1.h
#ifndef DATE1_H
#define DATE1_H
class Date {
public:
Date ( int = 1, int = 1, int = 1900 );
void print() const;
~Date();
private:
int month;
int day;
int year;
int checkDay ( int );
};
#endif
_______________________________________________________________________________
emply1.h
#ifndef EMPLY1_H
#define EMPLY1_H
#include "date1.h"
class Employee {
public:
Employee ( char *, char *, int, int, int, int, int, int );
void print() const;
~Employee();
private:
char firstName[ 25 ];
char lastName[ 25 ];
const Date birthDate;
const Date hireDate;
}
#endif
________________________________________________________________________
test.cpp
#include <iostream.h>
#include <string.h>
#include "date1.h"
Date::Date ( int mn, int dy, int yr)
{
if ( mn > 0 && mn <= 12 )
month = mn;
else {
month = 1;
cout < < "Month " < < mn < < " invalid. Set to month 1.\n";
}
year = yr;
day = checkDay ( dy );
cout < < "Date object consturctor for date ";
print();
cout < < endl;
}
void Date::print() const
{ cout < < month < < '/' < < day < < '/' < < year; }
Date::~Date()
{
cout < < "Date object destructor for date ";
print();
cout < < endl;
}
int Date::checkDay ( int testDay )
{
static const int daysPerMonth[ 13 ] =
{ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if ( testDay > 0 && testDay <= daysPerMonth[ month ] )
return testDay;
if ( month == 2 && testDay == 29 &&
( year % 400 == 0 ||
( year % 4 == 0 && year % 100 != 0 ) ) )
return testDay;
cout < < "Day " < < testDay < < " invalid. Set to day 1.\n";
return 1;
}
// Fig. 7.4: emply1.cpp
// Member function definition for Employee class.
#include <iostream.h>
#include <string.h>
#include "emply1.h"
#include "date1.h"
Employee::Employee( char *fname, char *lname,
int bmonth, int bday, int byear,
int hmonth, int hday, int hyear )
: birthDate ( bmonth, bday, byear ),
hireDate ( hmonth, hday, hyear )
{
int length = strlen ( fname );
length = ( length < 25 ? length : 24 );
strncpy ( firstName, fname, length );
firstName[ length ] = '\0';
length = strlen ( lname );
length = ( length < 25 ? length : 24 );
strncpy ( lastName, lname, length );
lastName[ length ] = '\0';
cout < < "Employee object constructor: "
< < firstName < < ' ' < < lastName < < endl;
}
void Employee::print() const
{
cout < < lastName < < ", " < < firstName < < "\nHired: ";
hireDate.print();
cout < < " Birth date: ";
birthDate.print();
cout < < endl;
}
Employee::~Employee()
{
cout < < "Employee object destructor: "
< < lastName < < ", " < < firstName < < endl;
}
// Fig. 7.4: fig07_04.cpp
// Demonstrating composition: an object with member objects.
#include <iostream.h>
#include <conio.h>
#include "emply1.h"
int main()
{
Employee e ( "bob", "Jones", 7, 24, 1949, 3, 12, 1988 );
cout < < '\n';
e.print();
cout < < "\nTest Date constructor with invalid values:\n";
Date d ( 14, 35, 1994 );
cout < < endl;
getch();
return 0;
}
_________________________________________________________________________________
ISO C++ forbids defining types within return type
return type specification for constructor invalid.