c++primer.plus第五版 13.4多态公有继承的(13.7~13.9程序)怎么编译不过去拉,
//brass.h--bank account classes
#ifndef BASS_H_
#define BASS_H_
//Brass Acount Class
class Brass
{
private:
enum{MAX=35};
char fullName[MAX];
long acctNum;
double balance;
public:
Brass(const char*s="Nullbody",long an=-1,double bal=0.0);
void Deposit(double amt);
virtual void Withdraw(double amt);
double Balance()const;
virtual void ViewAcct()const;
virtual~Brass();
};
//Brass Plus Account Class
class BrassPlus:public Brass
{
private:
double maxLoan;
double rate;
double owesBank;
public:
BrassPlus(const char*s="Nullbody",long an=-1,
double bal=0.0,double ml=500,
double r=0.10);
BrassPlus(const Brass&ba,double ml=500,double r=0.1);
virtual void ViewAcct()const;
virtual void Withdraw(double amt);
void ResetMax(double m){maxLoan=m;}
void ResetRate(double r){rate=r;}
void ResetOwes(){owesBank=0;}
};
#endif
//brass.cpp--bank account class methods
#include<iostream>
#include<cstring>
#include"brass.h"
using std::cout;
using std::ios_base;
using std::endl;
//Base methods
Brass::Brass(const char*s,long an,double bal)
{
std::strncpy(fullName,s,MAX-1);
fullName[MAX-1]='\0';
acctNum=an;
balance=bal;
}
void Brass::Deposit(double amt)
{
if(amt<0)
cout<<"Neqative deposit not allowed:"
<<"deposit is cancelled.\n";
else
balance+=amt;
}
void Brass::Withdraw(double amt)
{
if(amt<0)
cout<<"Withdrawal amout must be positive:"
<<"withdrawal canceled.\n";
else if(amt<=balance)
balance-=amt;
else
cout<<"Withdramal amount of $"<<amt
<<"exceeds your balance.\n"
<<"Withdrawal canceled.\n";
}
double Brass::Balance()const
{
return balance;
}
void Brass::ViewAcct()const
{
//set up ###.## format
ios_base::fmtflags initialState=
cout.setf(ios_base::fixed,ios_base::floatfield);
cout.setf(ios_base::showpoint);
cout.precision(2);
cout<<"Client:"<<fullName<<endl;
cout<<"Account Number:"<<acctNum<<endl;
cout<<"Balance:$"<<balance<<endl;
cout.setf(initialState);// restore original format
}
//BrassPlus Methods
BrassPlus::BrassPlus(const char*s,long an,double bal,
double ml,double r):Brass(s,an,bal)
{
maxLoan=ml;
owesBank=0.0;
rate=r;
}
BrassPlus::BrassPlus(const Brass&ba,double ml,double r)
:Brass(ba)// uses implicit copy constructor
{
maxLoan=ml;
owesBank=0.0;
rate=r;
}
//redefine how ViewAcct()works
void BrassPlus::ViewAcct()const
{
//set up ###.## format
ios_base::fmtflags initialState=
cout.setf(ios_base::fixed,ios_base::floatfield);
cout.setf(ios_base::showpoint);
cout.precision(2);
Brass::ViewAcct();//display base portion
cout<<"Maximum loan:$"<<maxLoan<<endl;
cout<<"Owed to bank:$"<<owesBank<<endl;
cout<<"Loan Rate:"<<100*rate<<"%\n";
cout.setf(initialState);
}
//redefine how Withdram()works
void BrassPlus::Withdraw(double amt)
{
//set up ###.## format
ios_base::fmtflags initialState=
cout.setf(ios_base::fixed,ios_base::floatfield);
cout.setf(ios_base::showpoint);
cout.precision(2);
double bal=Balance();
if(amt<=bal)
Brass::Withdraw(amt);
else if(amt<=bal+maxLoan-owesBank)
{
double advance=amt-bal;
owesBank+=advance*(1.0+rate);
cout<<"Bank advance:$"<<advance<<endl;
cout<<"Finance charge:$"<<advance*rate<<endl;
Deposit(advance);
Brass::Withdraw(amt);
}
else
cout<<"Credit limit exceeded.Transaction cancellde.\n";
cout.setf(initialState);
}
//usebrass1.cpp--testing bank account classes
//comile with brass.cpp
#include<iostream>
#include"brass.h"
int main()
{
using std::cout;
using std::endl;
Brass Piggy("Porcelot Pigg",381299,4000.00);
BrassPlus Hoggy("Horatio Hogg",382288,3000.00);
Piggy.ViewAcct();
cout<<endl;
Hoggy.ViewAcct();
cout<<endl;
cout<<"Depositing $1000 into the Hogg Account:\n";
Hoggy.Deposit(1000.00);
cout<<"New balance:$"<<Hoggy.Balance()<<endl;
cout<<"Withdrawing $4200 from the Pigg Account:\n";
Piggy.Withdraw(4200.00);
cout<<"Pigg account balance:$"<<Piggy.Balance()<<endl;
cout<<"Withdrawing $4200 from the Hogg Account:\n";
Hoggy.Withdraw(4200.00);
Hoggy.ViewAcct();
return 0;
}
[解决办法]
改了下格式,拼写错误,还有楼主的问题。
- C/C++ code
//brass.h--bank account classes#ifndef BASS_H_#define BASS_H_//Brass Account Classclass Brass{private: enum { MAX=35 }; char fullName[MAX]; long acctNum; double balance;public: Brass(const char*s = "Nullbody", long an = -1,double bal = 0.0); void Deposit(double amt); virtual void Withdraw(double amt); double Balance() const; virtual void ViewAcct() const; virtual ~Brass();};//Brass Plus Account Classclass BrassPlus:public Brass{private: double maxLoan; double rate; double owesBank;public: BrassPlus(const char*s = "Nullbody",long an = -1, double bal = 0.0, double ml = 500, double r = 0.10); BrassPlus(const Brass&ba, double ml = 500,double r = 0.1); virtual void ViewAcct() const; virtual void Withdraw(double amt); void ResetMax(double m){maxLoan = m;} void ResetRate(double r){rate = r;} void ResetOwes(){ owesBank = 0; }};#endif//brass.cpp--bank account class methods#include<iostream>#include<cstring>#include"brass.h"using std::cout;using std::ios_base;using std::endl;//Base methodsBrass::Brass(const char*s, long an, double bal){ std::strncpy(fullName, s, MAX - 1); fullName[MAX - 1] = '\0'; acctNum = an; balance = bal;}void Brass::Deposit(double amt){ if(amt < 0) cout<<"Negative deposit not allowed:" <<"deposit is canceled.\n"; else balance += amt;}void Brass::Withdraw(double amt){ if(amt < 0) cout<<"Withdrawal amount must be positive:" <<"withdrawal canceled.\n"; else if(amt <= balance) balance -= amt; else cout<<"Withdrawal amount of $"<<amt <<"exceeds your balance.\n" <<"Withdrawal canceled.\n";}double Brass::Balance() const{ return balance;}void Brass::ViewAcct() const{ //set up ###.## format ios_base::fmtflags initialState = cout.setf(ios_base::fixed,ios_base::floatfield); cout.setf(ios_base::showpoint); cout.precision(2); cout<<"Client:"<<fullName<<endl; cout<<"Account Number:"<<acctNum<<endl; cout<<"Balance:$"<<balance<<endl; cout.setf(initialState);// restore original format}//BrassPlus MethodsBrassPlus::BrassPlus(const char*s,long an,double bal, double ml,double r):Brass(s,an,bal){ maxLoan = ml; owesBank = 0.0; rate = r;}BrassPlus::BrassPlus(const Brass&ba,double ml,double r) :Brass(ba)// uses implicit copy constructor{ maxLoan = ml; owesBank = 0.0; rate = r;}//redefine how ViewAcct()worksvoid BrassPlus::ViewAcct()const{ //set up ###.## format ios_base::fmtflags initialState = cout.setf(ios_base::fixed,ios_base::floatfield); cout.setf(ios_base::showpoint); cout.precision(2); Brass::ViewAcct();//display base portion cout<<"Maximum loan:$"<<maxLoan<<endl; cout<<"Owed to bank:$"<<owesBank<<endl; cout<<"Loan Rate:"<<100*rate<<"%\n"; cout.setf(initialState);}//redefine how Withdram()worksvoid BrassPlus::Withdraw(double amt){ //set up ###.## format ios_base::fmtflags initialState = cout.setf(ios_base::fixed,ios_base::floatfield); cout.setf(ios_base::showpoint); cout.precision(2); double bal; bal = Balance(); //ERROR HERE if(amt <= bal) Brass::Withdraw(amt); else if(amt <= bal+maxLoan-owesBank) { double advance = amt - bal; owesBank += advance*(1.0 + rate); cout<<"Bank advance:$"<<advance<<endl; cout<<"Finance charge:$"<<advance*rate<<endl; Deposit(advance); Brass::Withdraw(amt); } else cout<<"Credit limit exceeded.Transaction canceled.\n"; cout.setf(initialState);}//usebrass1.cpp--testing bank account classes//compile with brass.cpp#include<iostream>#include"brass.h"int main(){ using std::cout; using std::endl; Brass Piggy("Porcelot Pigg", 381299, 4000.00); BrassPlus Hoggy("Horatio Hogg", 382288, 3000.00); Piggy.ViewAcct(); cout<<endl; Hoggy.ViewAcct(); cout<<endl; cout<<"Depositing $1000 into the Hogg Account:\n"; Hoggy.Deposit(1000.00); cout<<"New balance:$"<<Hoggy.Balance()<<endl; cout<<"Withdrawing $4200 from the Pigg Account:\n"; Piggy.Withdraw(4200.00); cout<<"Pigg account balance:$"<<Piggy.Balance()<<endl; cout<<"Withdrawing $4200 from the Hogg Account:\n"; Hoggy.Withdraw(4200.00); Hoggy.ViewAcct(); return 0;}
[解决办法]
double bal=Balance(); //=格式有问题···
