为什么 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"
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"