我是来自Java的c ++的新手,所以我不确定我在这里做错了什么
person.h
中的以下行给出了错误Transaction has not been declared
。
void pay(Transaction transaction);
我有一个Transaction对象,我是否必须在person.h
文件中声明/包含它?
这是我的person.h
来源
#ifndef PERSON_H_
#define PERSON_H_
#include "Transaction.h"
using std::string;
class Person {
public:
class Transaction;
Person();
virtual ~Person();
void pay(Transaction* transaction);
};
#endif /* PERSON_H_ */
答案 0 :(得分:4)
在C ++中,从定义中分离声明是一件大事。声明告诉如何使用代码,并在标头(.h
)文件中。定义是代码本身,并且在源(.cpp
)文件中。
如果文件仅通过指针或引用引用Transaction
(在标题中很常见),那么您只需要使用class Transaction;
预先声明事务类。如果文件需要实际的交易值,则需要#include "Transaction.h"
。
如果仍然表示Transaction
是未定义的符号,则表示您具有循环依赖关系:一系列在循环中相互包含的标头。在这种情况下,您需要更改其中一个头文件以仅使用指针和引用,并预先声明其他头中的类。
答案 1 :(得分:3)
当您在另一个类中声明一个类时,您将声明一个内部类。
所以
class Person {
public:
class Transaction;
};
声明一个完全限定名为Person :: Transaction的类。即使在全局范围内有另一个名为Transaction的类,对Transaction的引用也将被假定为引用Person :: Transaction。由于您尚未定义该类,因此会出现错误。
你想要的是:: Transaction,要么包括标题,要么在你的类声明之外声明。做任何一件事
class Transaction;
class Person {
};
OR
#include "Transaction.h"
class Person
{
};
前者只允许通过引用传递。按值传递或调用函数需要include提供的完整类定义。
答案 2 :(得分:2)
我可以想到(至少)两个可能的原因:
Transaction
的前瞻声明应该在Person
吗?这意味着Transaction
是Person
中的嵌套类。答案 3 :(得分:1)
你必须包含定义Transaction的头文件(如果你曾经使用过指针,那么你只需要在你的h文件中转发声明Transaction类,并且只在实现文件中包含Transaction.h)。 / p>
答案 4 :(得分:0)
#include "Transaction.h"
位于文件顶部应该可以解决问题。
答案 5 :(得分:0)
感谢发布更多代码。试试这个:
class Transaction
#include "Transaction.h"
希望这有帮助