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 to
Checking::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;
检查.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.cpp
和 Savings.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++为什么要引入继承 | 继承概念及定义 | 基类和派生类对象赋值转换 | 继承中的作用域 | 派生类的默认成员函数 | 继承与友元/静态成员 | 复杂的菱形继承及菱形虚拟继承
C++进阶:继承C++为什么要引入继承 | 继承概念及定义 | 基类和派生类对象赋值转换 | 继承中的作用域 | 派生类的默认成员函数 | 继承与友元/静态成员 | 复杂的菱形继承及菱形虚拟继承