为什么Qt告诉我:期望的班级名字?

时间:2015-03-27 10:07:25

标签: c++ qt header-files

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;
}

1 个答案:

答案 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”