为什么 Qt 告诉我:应为 class 名称?

Why is Qt telling me: expected class name?

Qt 在第 5 行抱怨 deposit.h,说 "expected class name"。

我知道这与我的头文件以及我包含它们的顺序有关。
但是据我所知,一切都应该没问题吗? 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;
}

尽可能在 header 秒内使用 forward declarations,而不是 #including a header。例如,在 SavingsAccount class 中,您使用交易指针而不是交易实例,因此不需要包含交易 header。

除了因为编译器必须打开包含的文件并检查 header 守卫而导致编译速度的开销之外,您还可能会遇到诸如循环依赖等问题。

因此,将 SavingsAccount class 更改为:-

#ifndef SAVINGSACCOUNT
#define SAVINGSACCOUNT

class Transaction; // forward declaration of the class Transaction

class SavingsAccount {

...

};

交易 class 没有引用存款,因此可以删除 #include "deposit.h"。

如果您随后需要在 main.cpp 中创建存款 class,请在 main.cpp

的顶部添加 #include "deposit.h"