2013-05-08 23 views
0

主:麻煩與++抽象類在C

#include <iostream> 
#include <string> 
#include "serviceChargeChecking.h" 

int main() 
{ 
    serviceChargeChecking newAccount("Crim", 111222, 50.00, 100, 1.00); 


    system("PAUSE"); 
    return 0; 
} 

serviceChargeChecking.h:

#ifndef H_serviceChargeChecking 
#define H_serviceChargeChecking 

#include "checkingaccount.h" 
#include <string> 


class serviceChargeChecking: public checkingAccount 
{ 
public: 
    void setMonthlyFee(double); 
    void writeCheck(int); 
    void getMonthlyStatement() const; 
    serviceChargeChecking(std::string =" ",int = 0, double = 0.00, int= 0, double =  0.00); 
private: 
    double serviceCharge; 

}; 
#endif 

serviceChargeChecking.cpp:

#include "serviceChargeChecking.h" 
#include <iostream> 

using std::string; 


void serviceChargeChecking::setMonthlyFee(double fee) 
{ 
    serviceCharge=fee; 
} 
void serviceChargeChecking::getMonthlyStatement() const 
{ 
    checkingAccount::getMonthlyStatement(); 
    std::cout<< "Service Charge: " << serviceCharge << std::endl; 
} 
void serviceChargeChecking::writeCheck(int ammount) 
{ 
    if(checkingAccount::getChecks()>0) 
    { 
     checkingAccount::setChecks(checkingAccount::getChecks()-ammount); 
    } 
    else 
    { 
     std::cout<<"No checks available." << std::endl; 
    } 
} 
serviceChargeChecking::serviceChargeChecking(string name, int acct, double bal, int numCheck, double sCharge) 
{ 
    bankAccount::setAcctOwnersName(name); 
    bankAccount::setAcctNum(acct); 
    bankAccount::setBalance(bal); 
    checkingAccount::setChecks(numCheck); 
    serviceCharge=sCharge; 
} 

checkingAccount.h:

#ifndef H_checkingAccount 
#define H_checkingAccount 
#include "bankAccount.h" 
#include <iostream> 

class checkingAccount: public bankAccount 
{ 
public: 
    virtual void writeCheck()=0; 
    void deposit(double); 
    void withdraw(double); 
    void getMonthlyStatement() const; 
    int getChecks(); 
    void setChecks(int); 

private: 
    int numChecks; 
}; 
#endif 

checkingAccount.cpp:

#include "checkingAccount.h" 
#include <iostream> 

int checkingAccount::getChecks() 
{ 
    return numChecks; 
} 
void checkingAccount::setChecks(int c) 
{ 
    numChecks=c; 
} 
void checkingAccount::deposit(double d) 
{ 
    bankAccount::setBalance(bankAccount::getBalance()+d); 
} 
void checkingAccount::withdraw(double w) 
{ 
    bankAccount::setBalance(bankAccount::getBalance()-w); 
} 
void checkingAccount::getMonthlyStatement() const 
{ 
    bankAccount::getMonthlyStatement(); 
} 

bankAccount.h:

#ifndef H_bankAccount 
#define H_bankAccount 
#include <string> 

class bankAccount 
{ 
public: 
    std::string getAcctOwnersName() const; 
    int getAcctNum() const; 
    double getBalance() const; 
    void getMonthlyStatement() const; 

    void setAcctOwnersName(std::string); 
    void setAcctNum(int); 
    void setBalance(double); 

    virtual void withdraw(double)=0; 
    virtual void deposit(double)=0; 
private: 
    std::string acctOwnersName; 
    int acctNum; 
    double acctBalance; 
}; 
#endif 

bankAccount.cpp:

#include "bankAccount.h" 
#include <iostream> 
using std::string; 


string bankAccount::getAcctOwnersName() const 
{ 
    return acctOwnersName; 
} 
int bankAccount::getAcctNum() const 
{ 
    return acctNum; 
} 
double bankAccount::getBalance() const 
{ 
    return acctBalance; 
} 
void bankAccount::setAcctOwnersName(string name) 
{ 
    acctOwnersName=name; 
} 
void bankAccount::setAcctNum(int num) 
{ 
    acctNum=num; 
} 
void bankAccount::setBalance(double b) 
{ 
    acctBalance=b; 
} 
void bankAccount::getMonthlyStatement() const 
{ 
    std::cout << "Name on Account: " << getAcctOwnersName() << std::endl; 
    std::cout << "Account Id: " << getAcctNum() << std::endl; 
    std::cout << "Balance: " << getBalance() << std::endl; 
} 

我知道這是很多代碼,但任何人都可以幫助我理解爲什麼我不能從類中創建一個對象serviceChargeChecking錯誤告訴我,我無法從抽象類創建一個對象,但它對我來說似乎不是抽象的。

+1

錯誤消息將有助於縮小搜索範圍。 – 2013-05-08 13:27:31

+1

有太多的代碼要閱讀。你能重寫你的問題嗎? – mb14 2013-05-08 13:28:00

+0

錯誤是在newAccount下的主類中聲明:抽象類類型的對象「serviceChargeChecking」不允許 – 2013-05-08 13:28:56

回答

1

這是因爲你的CheckingAcount有writeCheck()和serviceChargeChecking有writeCheck(int);

+0

謝謝!!!!大聲笑愚蠢的小錯誤總是讓我 – 2013-05-08 13:31:04

+0

是的,這種事很容易錯過,尤其是在自己的代碼。 – Simon 2013-05-08 13:43:57

2

serviceChargeChecking實現void writeCheck(int),但是從checkingAccount純虛函數的類型是void writeCheck(),所以它仍然是純粹的serviceChargeChecking,這使得抽象類。

2

您在抽象類checkingAccount有這樣的:

virtual void writeCheck()=0; 

,但在派生類serviceChargeChecking實現這個:

void writeCheck(int); 

的簽名必須是相同的。

2

writeCheck()方法在serviceChargeCheckingcheckingAccount中有不同的簽名。

如果您使用C++ 11,請使用override以避免此類錯誤。

1

這可能是由於這樣的事實,你沒有覆蓋的CheckingAccount的,writeCheck方法,抽象的原型是

中的CheckingAccount類

virtual void writeCheck()=0; 

和serviceChargeChecking類

void writeCheck(int); 

注意這些參數,你沒有覆蓋你可能繼承它的checkingAccount的writeCheck(隱式地),serviceChargeChecking做了一個新的用一個int參數writeCheck。