【发布时间】:2015-03-27 17:43:20
【问题描述】:
我有一个 QT 项目,其中给了我一个 UML 图和一些说明(见下文)
我对自己在做什么感到迷茫,所以我只想展示我所有的代码,它已经完成但没有工作......我现在得到的主要错误是所有事务类型的构造函数(存款、取款和余额查询)给出“调用'Transaction::Transaction()'没有匹配函数”错误。我可能只是做错了。感谢我能得到的任何帮助...
这是我所有的代码: 储蓄账户.h
#ifndef SAVINGSACCOUNT_H
#define SAVINGSACCOUNT_H
#include "transaction.h"
#include "deposit.h"
#include "balanceenquiry.h"
#include "withdrawal.h"
class SavingsAccount
{
private:
QString m_CustomerName;
QString m_AccountNumber;
QList<Transaction*> m_TransactionList;
public:
SavingsAccount(QString name, QString num);
~SavingsAccount();
void addTransaction(Transaction* t);
double totalTransactionCost();
QString frequentTransactionType();
QList<Transaction*> transactionsOnAdate(QDate date);
QString toString() const;
};
#endif // SAVINGSACCOUNT_H
储蓄账户.cpp
#include "savingsaccount.h"
SavingsAccount::SavingsAccount(QString name, QString num) {
m_CustomerName = name;
m_AccountNumber = num;
}
SavingsAccount::~SavingsAccount() {
while(!m_TransactionList.isEmpty()) {
delete m_TransactionList.takeFirst();
} //Deletes all list items
}
SavingsAccount::addTransaction(Transaction* t) {
m_TransactionList << t; //Adds transaction to list
}
double SavingsAccount::totalTransactionCost() {
double totalCost;
for(int i = 0; i < m_TransactionList.size(); i++) {
totalCost += m_TransactionList.at(i)->computeCost();
}
return totalCost; //Returns total transaction cost
}
QString SavingsAccount::frequentTransactionType() {
QString frequentType;
int deposit, withdrawal, balanceEnquiry;
for(int i = 0; i < m_TransactionList.size(); i++) {
if(m_TransactionList.at(i)->getType() == "Deposit") {
deposit++;
}
else if(m_TransactionList.at(i)->getType() == "Withdrawal") {
withdrawal++;
}
else if(m_TransactionList.at(i)->getType() == "Balance Enquiry") {
balanceEnquiry++;
}
}
if(deposit > withdrawal && deposit > balanceEnquiry) {
frequentType = "Deposit";
} else if(withdrawal > balanceEnquiry && withdrawal > deposit) {
frequentType = "Withdrawal";
} else if(balanceEnquiry > deposit && balanceEnquiry > withdrawal) {
frequentType = "Balance Enquiry";
}
else {
frequentType = "NA";
}
return frequentType;//Returns most frequent transaction type
}
QList<Transactions*> SavingsAccount::transactionsOnDate(QDate date) {
QList<Transaction*> transactions;
for(int i = 0; i < m_TransactionList.size(); i++) {
if(m_TransactionList.at(i)->getDateTime().date() == date) {
transactions << m_TransactionList;
}
}
return transactions;
}
QString SavingsAccount::toString() {
return "Savings Account:\n================\n"
+ "Customer Name: " + m_CustomerName + "\n"
+ "Account Number: " + m_AccountNumber + "\n"
+ "================\nTransactions\n================\n"
+ m_TransactionList
+ "================\nTransaction Details\n================\n"
+ "Total Transaction Cost: R" + totalTransactionCost()
+ "Most Frequent Transaction Type: " + frequentTransactionType()
+ "================\nTransactions Today\n================"
+ transactionsOnAdate(QDate::currentDate());
}
transaction.h
#ifndef TRANSACTION_H
#define TRANSACTION_H
#include <QString>
#include <QDateTime>
class Transaction
{
protected:
QString m_Type;
QDateTime m_DateTime;
public:
Transaction(QString type, QDateTime datetime);
QString getType();
QString toString();
QDateTime getDateTime();
virtual double computeCost();
};
transaction.cpp
#include "transaction.h"
Transaction::Transaction(QString type, QDateTime datetime) {
m_Type = type;
m_DateTime = datetime;
}
QString Transaction::getType() {
return m_Type;
}
QString Transaction::toString() {
return m_Type + " " + m_DateTime.toString() + "\n";
}
QDateTime Transaction::getDateTime() {
return m_DateTime;
}
double Transaction::computeCost() {
return 0;//Virtual Function (meant to be overrided)
}
存款.h
#ifndef DEPOSIT_H
#define DEPOSIT_H
#include "transaction.h"
#include <QString>
class Deposit: public Transaction
{
private:
double m_Amount;
const double m_Fee = 5.0; //reasonable amount R5 deposit
public:
Deposit(double amount);
QString toString();
double computeCost();
};
#endif // DEPOSIT_H
存款.cpp
#include "deposit.h"
Deposit::Deposit(double amount) {
m_Amount = amount;
m_Type = "Deposit";
m_DateTime = QDateTime::currentDateTime();
}
QString Deposit::toString() {
return Transaction::toString() + "Amount: R" + m_Amount
+ "\nFee: R" + m_Fee;
}
double Deposit::computeCost() {
return m_Fee;
}
提款.h
#ifndef WITHDRAWAL_H
#define WITHDRAWAL_H
#include "transaction.h"
#include <QString>
class Withdrawal: public Transaction
{
private:
double m_Amount;
double m_Percentage = 3; //3% withdrawal cost
public:
Withdrawal(double amount);
QString toString() const;
double computeCost();
};
#endif // WITHDRAWAL_H
withdrawal.cpp
#include "withdrawal.h"
Withdrawal::Withdrawal(double amount) {
m_Amount = amount;
m_Type = "Withdrawal";
m_DateTime = QDateTime::currentDateTime();
}
QString Withdrawal::toString() {
return Transaction::toString() + "Amount: R" + m_Amount
+ "\nFee Percentage: " + m_Percentage + "%";
}
double Withdrawal::computeCost() {
return m_Amount*m_Percentage/100;
}
balanceenquiry.h
#ifndef BALANCEENQUIRY_H
#define BALANCEENQUIRY_H
#include "transaction.h"
#include <QString>
#include <QDate>
class BalanceEnquiry: public Transaction
{
private:
QDate m_FromDate;
QDate m_ToDate;
public:
BalanceEnquiry(QDate fDate, QDate tDate);
QString toString() const;
double computeCost();
};
#endif // BALANCEENQUIRY_H
balanceenquiry.cpp
#include "balanceenquiry.h"
BalanceEnquiry::BalanceEnquiry(QDate fDate, QDate tDate) {
m_FromDate = fDate;
m_ToDate = tDate;
m_Type = "Balance Enquiry";
m_DateTime = QDateTime::currentDateTime();
}
QString BalanceEnquiry::toString() {
return Transaction::toString() + "From: " + m_FromDate
+ "/nTo: " + m_ToDate;
}
double BalanceEnquiry::computeCost() {
return 0; //Balance Enquiry costs nothing
}
main.cpp
#include <QCoreApplication>
#include "savingsaccount.h"
#include <QDebug>
QTextStream cout(stdout);
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//Declare variables
QString customerName = "Barry Doyle";
QString accountNumber = "1234567890";
//Implement Savings Account
SavingsAccount account(customerName, accountNumber);
//Implement Transactions
Deposit d1(500.0);
BalanceEnquiry b1(QDate::currentDate(), QDate::currentDate());
Withdrawal w1(200.0);
Withdrawal w2(250.0);
BalanceEnquiry b2(QDate::currentDate(), QDate::currentDate());
Deposit d2(400.0);
Deposit d3(150.0);
Transaction *t1 = &d1;
Transaction *t2 = &b1;
Transaction *t3 = &w1;
Transaction *t4 = &w2;
Transaction *t5 = &b2;
Transaction *t6 = &d2;
Transaction *t7 = &d3;
//Add Transactions to Transaction List
account.addTransaction(t1);
account.addTransaction(t2);
account.addTransaction(t3);
account.addTransaction(t4);
account.addTransaction(t5);
account.addTransaction(t6);
account.addTransaction(t7);
account.toString();
return a.exec();
}
【问题讨论】:
-
仔细查看
Transaction的类图。方法computeCost是斜体。这意味着整个类是一个抽象类,computeCost应该被定义为纯虚拟的。即,它不应该有在transaction.cpp中定义的函数体,应该定义为virtual double computeCost() = 0; -
谢谢,对这些虚函数的工作原理没有任何经验或理解......我已经做到了,但它给了我一个错误,说'virtual' outside class declaration and function 'double computeCost()' 像变量一样被初始化
-
你误会了,纯虚函数是在类定义中声明的。见learncpp.com/cpp-tutorial/…
标签: c++ qt inheritance base-class qlist