Как разрешить внешний символ
Я создаю модель банковской системы на C++, и существует несколько типов учетных записей, все они наследуются от базового класса Account. Я не уверен точно, что вызывает ошибки LNK, поскольку я не верю, что я использую внешние библиотеки для компилятора, если он не просматривает мои файлы.h и.cpp как внешние библиотеки. Список ошибок, который я получаю:
1>------ Build started: Project: Bank, Configuration: Debug Win32 ------
1> Account.cpp
1>CurrentAccount.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall CurrentAccount::~CurrentAccount(void)" (??1CurrentAccount@@UAE@XZ) referenced in function "public: virtual void * __thiscall CurrentAccount::`scalar deleting destructor'(unsigned int)" (??_GCurrentAccount@@UAEPAXI@Z)
1>H:\C++ Assignment\Bank\Debug\Bank.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
А вот файл Account.h, который наследуют все остальные классы
#pragma once
#include "Person.h"
using namespace std;
class Account
{
public:
enum AccountType {Current, JrCurrent, StdntSavings, CorpSavings, PersonalLoan, CorpLoan, Mortgage, GuaranteeCard, CreditCard, GFInvestment, EFInvestment, Pension};
Account(double balance, double interestRate, Person accountHolder);
Account(double balance, double interestRate, Person accountHolder, AccountType type);
Account(){};
virtual ~Account();
double getBalance(), getInterestRate();
Person getAccountHolder();
void deposit(double amount), changeInterest(double newInterest), calculateInterest();
bool isType(AccountType type);
bool hasFunds();
bool withdraw(double amount);
string toString();
protected:
Person accountHolder;
double balance, interestRate, creditLimit;
AccountType accType;
friend ostream& operator<<(ostream &out, Account& other);
};
И как пример того, как я наследую:
#pragma once
#include "Account.h"
class StudentSavings:public Account
{
//stuff
};
1 ответ
Вы не определили свой виртуальный деструктор.
Сообщение об ошибке ясно говорит вам, что этот символ не определен.
virtual ~Account() {}
Компоновщик работает не только со сторонними библиотеками, но и со всеми определениями и символами в вашем собственном коде. Вы должны предоставить их при использовании (а виртуальный деструктор всегда "используется").