Qt在第5行抱怨deposit.h,说"期望的类名"。
我知道它与我的头文件和我如何包含它们的顺序有关。
但从我可以看到,一切都应该没问题? Deposit.h知道Transaction.h,反之亦然。
请记住,这是一项正在进行中的工作。如果你需要一个实现文件,那就喊。
Deposit.h
#ifndef DEPOSIT
#define DEPOSIT
#include "transaction.h"
class Deposit : public Transaction {
public:
Deposit(double amount);
QString toString() const;
double computeCost() const;
private:
double m_Amount;
static double m_Fee;
};
#endif // DEPOSIT
Transaction.h
#ifndef TRANSACTION
#define TRANSACTION
#include <QString>
#include <QTextStream>
#include <QList>
#include <QDate>
#include "deposit.h"
class Transaction {
public:
Transaction(QString type, QDateTime datetime);
QString getType() const;
QString toString() const;
QDateTime getDateTime() const;
virtual double computeCost() const = 0;
protected:
QString m_Type;
QDateTime m_DateTime;
};
#endif // TRANSACTION
SavingsAccount.h
#ifndef SAVINGSACCOUNT
#define SAVINGSACCOUNT
#include "transaction.h"
class SavingsAccount {
public:
SavingsAccount(QString name, QString num);
virtual ~SavingsAccount();
void addTransaction(Transaction* t);
double totalTransactionCost() const;
QString frequentTransactionType() const;
QList<Transaction*> transactionOnAdate(QDate date) const;
virtual QString toString() const;
private:
QString m_CustomerName;
QString m_AccountNumber;
QList<Transaction*> m_TransactionList;
};
#endif // SAVINGSACCOUNT
Main.cpp的
#include "savingsaccount.h"
int main()
{
QTextStream cout(stdout);
QTextStream cin(stdin);
SavingsAccount Acc("John Doe", "999");
cout << endl;
return 0;
}
答案 0 :(得分:2)
如果可能,请在标头中使用forward declarations,而不是#including标头。例如,在SavingsAccount类中,您使用Transaction指针而不是Transaction实例,因此不需要包含Transaction头。
除了编译速度的开销,编译器必须打开包含的文件并检查标题保护,你可能会遇到问题,例如由于循环依赖而出现的问题。
因此,将SavingsAccount类更改为: -
#ifndef SAVINGSACCOUNT
#define SAVINGSACCOUNT
class Transaction; // forward declaration of the class Transaction
class SavingsAccount {
...
};
Transaction类不引用存款,因此可以删除#include“deposit.h”。
如果您需要在main.cpp中创建存款类,请在main.cpp顶部添加#include“deposit.h”