首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

抽象基类的试例,该如何解决

2012-02-28 
抽象基类的试例#ifndefACCTABC_H_#defineACCTABC_H_//AbstractBaseClassclassAcctABC{private:enum{MAX35

抽象基类的试例



#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。

热点排行