代码之家  ›  专栏  ›  技术社区  ›  Nat

C++类和继承错误:未定义对派生类的引用

  •  0
  • Nat  · 技术社区  · 11 年前

    我正在尝试制作一个程序的一部分,该程序使用银行帐户类作为基类,使用支票和储蓄作为派生类。在我进行任何花式数据处理之前,我一直在尝试建立基本框架,并遵循了一些教程来更好地理解类和继承。

    我一直在寻找答案,但我找到的答案似乎不是我的问题,但我可能只需要重新审视我的代码。

    编译器错误:

    在函数中 main': badriver.cpp:20: undefined reference to 正在检查::getAccount()' badriver.cpp:23:未定义的引用 Checking::setAccount(int)' badriver.cpp:24: undefined reference to 储蓄::setAccount(int)' badriver.cpp:26:对“Checking::getAccount()”的未定义引用

    badriver.cpp

    #include "BankAccount.cpp"
    #include "Checking.cpp"
    #include "Savings.cpp"
    #include <string>
    #include <iostream>
    using namespace std;
    
    int main(){
    
       Checking c;
       Savings s;
    
       cout << "Checking: " << c.getAccount() << " - Type: " << c.getType() << endl;
       cout << "Savings: " << s.getAccount() << " - Type: " << s.getType() << endl;
    
       c.setAccount(9);
       s.setAccount(15);
    
       cout << "New Checking: " << c.getAccount() << endl;
       cout << "New Savings: " << s.getAccount() << endl;
           return 0;
        }
    

    银行账户.h

    #ifndef BANKACCOUNT_H
    #define BANKACCOUNT_H
    #include <string>
    using std::string;
    using std::ostream;
    using std::istream;
    
    class BankAccount{
    
    private:
       int myAccount;
    
       const char* color;
    
    public:
       // default constructor
       BankAccount();
       BankAccount(int account);
       virtual ~BankAccount();
    
       virtual void setAccount(int)=0;
       int getAccount();
    //    
    //    void setSAccount(int);
    //    int getSAccount();
    //    
       virtual const char* getColor();                                            
       virtual const char* getType() = 0; 
       //virtual const char* getCType() = 0; 
    
    protected:
       void setColor(const char*);   
    
    };
    
    #endif // BANKACCOUNT_H
    

    银行账户.cpp

    #include "BankAccount.h"
    #include "Checking.h"
    #include "Savings.h"
    #include <string>
    #include <iostream>
    #include <cstdlib>
    using namespace std;
    
    // default constructor
    BankAccount::BankAccount(){
       account = 1;
    }
    
    BankAccount::~BankAccount(){}
    
    // void BankAccount::setAccount(int account){
    //    myAccount  = account;
    // }
    
    int BankAccount::getAccount(){
       return myAccount ;
    }
    
    BankAccount::BankAccount(int account){
       myAccount = account;
    }
    
    const char* BankAccount::getColor(){
       return color;
    }
    
    void BankAccount::setColor(const char* c){
       color = c;
    }
    

    正在检查.h

    #ifndef CHECKING_H
    #define CHECKING_H
    #include "BankAccount.h"
    #include <string>
    using std::string;
    using std::ostream;
    using std::istream;
    
    class Checking : public BankAccount{
    
    private:
       const char* type;
    
    public:
       Checking();
       virtual ~Checking();
       void setAccount(int account);
    
    
       virtual const char* getType();
    
       void setChecking(int);
       int getChecking();
    };
    
    #endif //CHECKING_H
    

    检查.cpp

    #include "Checking.h"
    #include <string>
    #include <string>
    #include <iostream>
    #include <cstdlib>
    using namespace std;
    
    Checking::Checking() : BankAccount(1), type("Checking"){}
    
    Checking::~Checking(){}
    
    BankAccount::~BankAccount(){}
    
    void BankAccount::setAccount(int account){
       myAccount  = account;
    }
    
    
    const char* Checking::getType(){
       return type;
    }   
    

    储蓄.h

    #ifndef  SAVINGS_H
    #define SAVINGS_H
    #include "BankAccount.h"
    #include <string>
    using std::string;
    using std::ostream;
    using std::istream;
    
    class Savings: public BankAccount{
    
    private:
       const char* type;
    
    public:
       Savings();
       virtual ~Savings();
       void setAccount(int account);
    
       virtual const char* getType();
    
       void setSavings(int);
       int getSavings();
    };
    
    #endif // SAVINGS_H
    

    节省.cpp

    #include "Savings.h"
    #include <string>
    #include <string>
    #include <iostream>
    #include <cstdlib>
    using namespace std;
    
    Savings::Savings() : BankAccount(2), type("Savings"){}
    
    Savings::~Savings(){}
    
    BankAccount::~BankAccount(){}
    
    void BankAccount::setAccount(int account){
       myAccount  = account;
    }
    
    const char* Savings::getType(){
       return type;
    }   
    

    谢谢你帮我指明正确的方向。

    1 回复  |  直到 11 年前
        1
  •  2
  •   M.M    11 年前

    Checking.cpp和Savings.cpp包含:

    BankAccount::~BankAccount(){}
    
    void BankAccount::setAccount(int account){
         myAccount  = account;
    }
    

    这会导致未定义的行为,因为您在多个文件中定义了这些函数。您需要从Checking.cpp和Savings.cpp中删除这些行,而是为编译器输出中缺少的函数添加定义:

    void Checking::setAccount(int account){
         // code here
    }