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

时间:2014-07-27 20:24:43

标签: c++ class inheritance derived-class base-class

我正在尝试创建一个程序的一部分,该程序使用银行帐户类作为基类,并检查和节省作为派生类。在进行任何奇特的数据处理之前,我一直在尝试设置基本框架,并且我已经按照一些教程来更好地理解类和继承。

我已经找到了答案,但我发现的答案似乎不是我的问题,但我可能只需要另外一些关注我的代码。

编译错误:

  

在函数main': badriver.cpp:20: undefined reference to中检查:: getAccount()'   badriver.cpp:23:未定义引用Checking::setAccount(int)' badriver.cpp:24: undefined reference to Savings :: 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;
    }

BankAccount.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

BankAccount.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;
}

Checking.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

Checking.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;
}   

Savings.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

Savings.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 个答案:

答案 0 :(得分:1)

Checking.cpp和Savings.cpp包含:

BankAccount::~BankAccount(){}

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

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

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