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

Posted

技术标签:

【中文标题】C++ 类和继承错误:未定义对派生类的引用【英文标题】:C++ class and inheritance error: undefined reference to derived class 【发布时间】:2014-07-27 20:24:42 【问题描述】:

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

我一直在寻找答案,但我找到的答案似乎不是我的问题,但我可能只需要另一双眼睛关注我的代码。

编译器错误:

在函数main': badriver.cpp:20: undefined reference toChecking::getAccount()' badriver.cpp:23: 对Checking::setAccount(int)' badriver.cpp:24: undefined reference toSavings::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;

检查.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;
   

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;
   

感谢您为我指明正确方向的任何帮助。

【问题讨论】:

这些是链接器错误。最有可能的是,Checking.cppSavings.cpp 实际上并没有被构建或链接。确保它们是您构建的一部分。 您可能希望在 Checking and Savings 中将 virtual 关键字添加到 setAcccount() 的定义中。 我将 #include "class.h" 文件更改为 #include "class.cpp" 文件,这似乎修复了链接器错误。我还尝试将 virtual 关键字添加到 setAccount(),但仍然收到以下错误消息: In function main': badriver.cpp:20: undefined reference to Checking::getAccount()' badriver.cpp:23: undefined reference to Checking::setAccount(int)' badriver.cpp:24: undefined reference to Savings::setAccount(int )' badriver.cpp:26: 对 `Checking::getAccount()' 的未定义引用 如果您想在多个编译单元中包含该头文件,则在头文件中包含定义(在 cpp 文件中)将不起作用。 您使用的是什么 IDE?你是如何编译你的项目的? 【参考方案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

等等

【讨论】:

非常感谢。有时小事很难看!

以上是关于C++ 类和继承错误:未定义对派生类的引用的主要内容,如果未能解决你的问题,请参考以下文章

如何修复“对‘Shape::Shape()’的未定义引用 - 在 C++ 中构建失败 3 个错误”

关于C++基类与派生类

c++ 继承问题:未定义对“vtable”的引用

未定义的引用,继承问题 - C++ [重复]

C++进阶:继承C++为什么要引入继承 | 继承概念及定义 | 基类和派生类对象赋值转换 | 继承中的作用域 | 派生类的默认成员函数 | 继承与友元/静态成员 | 复杂的菱形继承及菱形虚拟继承

C++进阶:继承C++为什么要引入继承 | 继承概念及定义 | 基类和派生类对象赋值转换 | 继承中的作用域 | 派生类的默认成员函数 | 继承与友元/静态成员 | 复杂的菱形继承及菱形虚拟继承