抽象基类的试例
#ifndef ACCTABC_H_
#define ACCTABC_H_
//Abstract Base Class
class AcctABC
{
private:
enum{MAX=35};
char fullName[MAX];
long acctNum;
double balance;
protected:
const char *FullName()const{return fullName;}
long AcctNum()const{return acctNum;}
std::ios_base::fmtflags SetFormat()const;
public:
AcctABC(const char *s= "Nullbody ",long an=-1,
double bal=0.0); //构造函数!
void Deposit(double amt); //函数(存钱)
virtual void Withdraw(double amt)=0;//纯虚函数(取钱)
double Balance()const{return balance;};//返回所余额
virtual void ViewAcct()const=0; //纯虚函数
virtual ~AcctABC(){}
};
//Brass Account Class
class Brass:public AcctABC
{
public:
Brass(const char *s= "Nullbody ",long an=-1,
double bal=0):AcctABC(s,an,bal){}
virtual void Withdraw(double amt);
virtual void ViewAcct()const;
virtual ~Brass(){}
};
//Brass Plus Account Class
class BrassPlus:public AcctABC
{
private:
double maxLoan;
double rate;
double owesBank;
public:
BrassPuls(const char *s= "Nullbody ",long an=-1,
double bal=0.0,double m1=500,
double r=0.10);
BrassPlus(const Brass &ba,double m1=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
///////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
#include <iostream>
#include <cstring>
#include "acctabc.h "
using std::cout;
using std::ios_base;
using std::endl;
//Abstract Base Class
AcctABC::AcctABC(const char *s,long an,double bal)
{
strncpy(fullName,s,MAX-1);
fullName[MAX-1]= '\0 ';
acctNum=an;
balance=bal;
}
void AcctABC::Deposit(double amt)
{
if(amt <0)
cout < < "Negative deposit not allowed: "
< < "deposit is cancellend.\n ";
else
balance+=amt;
}
void AcctABC::Withdraw(double amt)
{
balance-=amt;
}
//protected method
ios_base::fmtflags AcctABC::SetFormat()const
{
//set up ###.##format
ios_base::fmtflags initialState=
cout.setf(ios_base::fixed,ios_base::floatfield);
cout.setf(ios_base::showpoint);
cout.precision(2);
return initialState;
}
//Brass method
void Brass::Withdraw(double amt)
{
if(amt <0)
cout < < "Withdrawl amount must be positive; "
< < "withdrawl canceled.\n ";
else if(amt <=Balance())
AcctABC::Withdraw(amt);
else
cout < < "Withdrawal amount of $ " < <amt
< < "exceeds your balance.\n "
< < "withdrawal canceled.\n ";
}
void Brass::ViewAcct()const
{
ios_base::fmtflags initialState=SetFormat();
cout < < "Brass Client: " < <FullName() < <endl;
cout < < "Account Number: " < <FullName() < <endl;
cout < < "Balance: $ " < <Balance() < <endl;
cout.setf(initialState);
}
//BrassPlus Methods
BrassPlus::BrassPuls(const char *s,long an,double bal,
double m1,double r):AcctABC(s,an,bal)
{
maxLoan=m1;
owesBank=0.0;
rate=r;
}
BrassPlus::BrassPuls(const Brass &ba,double m1,double r):AcctABC(ba)
{
maxLoan=m1;
owesBank=0.0;
rate=r;
}
void BrassPlus::ViewAcct()const
{
ios_base::fmtflags initialStte=SetFormat();
cout < < "BrassPlus Client: " < <FullName() < <endl;
cout < < "Account Number: " < <AcctNum() < <endl;
cout < < "Balance: $ " < <Balance() < <endl;
cout < < "Maximum loan:$ " < <maxLoan < <endl;
cout < < "Owed to bank:$ " < <owesBank < <endl;
cout < < "Loan Rate: " < <100*rate < < "%\n ";
}
void BrassPlus::Withdraw(double amt)
{
ios_base::fmtflags initialState=SetFormat();
double bal=Balance();
if(amt <=bal)
AcctABC::Withdraw(amt);
else is(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);
AcctABC::Withdraw(amt);
}
else
cout < < "Credit limt exceeded. Transaction cancelled.\n ";
cout.setf(initialState);
}
进行编译时将发生以下错误:
--------------------Configuration: 抽象基类实验 - Win32 Debug--------------------
Compiling...
acctABC.cpp
D:\C++实验代码2\抽象基类实验\acctABC.cpp(65) : error C2550: 'BrassPuls ' : constructor initializer lists are only allowed on constructor definitions
D:\C++实验代码2\抽象基类实验\acctABC.cpp(70) : error C2511: 'BrassPuls ' : overloaded member function 'int (const class Brass &,double,double) ' not found in 'BrassPlus '
d:\c++实验代码2\抽象基类实验\acctabc.h(40) : see declaration of 'BrassPlus '
D:\C++实验代码2\抽象基类实验\acctABC.cpp(107) : fatal error C1004: unexpected end of file found
Error executing cl.exe.
[解决办法]
搂主,都是拼写错误啊,这种错误,太尴尬了,总结如下:
1。 void ResetRate(double r){rate=r;}; 这里的分号要去掉
2。 BrassPuls 有好多处都是这样写的,都改过来
3。 else is(amt <=bal+maxLoan-owesBank) 这里的else is//尴尬- -#
把这些拼写错误改正以后,程序在VS下面编译一切OK。