2015-03-27 1 views
0

Qt жалуется на deposit.h на строке 5, говоря «имя ожидаемого класса».Почему Qt говорит мне: ожидаемое название класса?

Я знаю, что это связано с моими заголовочными файлами и порядком в том, как я их включаю.
Но я вижу, все должно быть в порядке? 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

будет добавлять строки 'класса Transaction,' до определения класса Депозит помощи ? – Shf

+3

У вас есть круговая зависимость, 'Transaction.h' зависит от' Deposit.h', которая зависит от 'Transaction.h', которая зависит от' Deposit.h' и т. Д. Легко нарушить эту зависимость в вашем случае, поскольку 'Transaction .h' действительно не нужно «Deposit.h» или что-нибудь в нем. –

+1

@JoachimPileborg не так ли используется #ifndef? который должен просто не интерпретировать рекурсию. –

ответ

2

Где это возможно, использовать forward declarations в заголовках, а не #including заголовок. Например, в классе SavingsAccount используются указатели транзакций, а не экземпляр транзакции, поэтому включение заголовка транзакции не требуется.

Помимо того, что в процессе компиляции есть накладные расходы, когда компилятор должен открыть включенный файл и проверить защитник заголовка, вы можете столкнуться с такими проблемами, как те, которые вы видите из-за круговых зависимостей.

Таким образом, изменить класс SavingsAccount к: - класс

#ifndef SAVINGSACCOUNT 
#define SAVINGSACCOUNT 

class Transaction; // forward declaration of the class Transaction 

class SavingsAccount { 

... 

}; 

Сделка не ссылается на депозит, так #include "deposit.h" могут быть удалены.

Если после этого нужно создать класс депозита в main.cpp, добавьте #include «deposit.h» в верхней части main.cpp

+1

Хорошее объяснение, спасибо! –

Смежные вопросы