2011-10-21 126 views
1

我是来自Java的C++的新手,所以我不知道我在做什么错在这里 person.h中的以下行给我错误Transaction has not been declared'对象'没有被声明错误

void pay(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_ */ 
+1

您需要包含声明“Transaction”对象的文件。 – Dani

回答

3

在C++中,从定义中分离声明是一件大事。声明说明如何使用代码,并位于标题(.h)文件中。定义是代码本身,并在源文件中(.cpp)。

如果一个文件只是通过指针或引用指向Transaction(如在页眉中常见的那样),那么您只需要预先声明事务类class Transaction;。如果文件需要实际的交易值,则需要#include "Transaction.h"

如果仍然Transaction是一个未定义的符号,这意味着你有一个循环依赖:一系列头,其中包括相互的循环。在这种情况下,您需要更改其中一个头文件以仅使用指针和引用,并且预先声明其他头文件中的类。

+0

我已更新我的帖子,看看:S和我只有两个班,所以我不知道什么可能是错误的:S – fenerlitk

+0

将'class Transaction;'移动到类的_outside_(在全局范围内)。对不起,我没有具体。 –

1

,你必须包含在交易定义(如果你要使用一个指针,那么你可以只向前声明事务类的.h文件和头文件仅在实现文件中包含Transaction.h)。

+0

声明,没有定义 – Vlad

+0

嗯,我''包括“Transaction.h”'它仍然给我同样的错误!以及如何使用指针? – fenerlitk

+0

交易的指针是'Transaction *'。对交易的引用是“交易&”。 –

0

#include "Transaction.h"在你的文件的顶部应该做的伎俩。

+0

好吧,我已经更新了我的文章,请看一看。 – fenerlitk

0

感谢发布更多代码。试试这个:

  1. 在person.h文件,在上面放:class Transaction
  2. 在person.cpp文件,在上面放:#include "Transaction.h"

希望这有助于

3

当你在另一个类中声明一个类时,你声明了一个内部类。

所以

class Person { 
public: 

    class Transaction; 
}; 

声明一个类,它的全名是Person ::交易。即使在全局作用域中存在另一个名为Transaction的类,对Transaction的引用也将假定引用Person :: Transaction。既然你没有定义这个类,你会得到你的错误。

你想要的是::交易,无论是包括标题或从你的类声明外宣告。做任何

class Transaction; 
class Person { 
}; 

OR

#include "Transaction.h" 
class Person 
{ 
}; 

前者只允许通过引用传递。按值传递或调用函数需要include提供完整的类定义。

1

我能想到的(至少)两个这种可能的原因:

  • 你肯定Transaction向前声明应该是在Person?这意味着TransactionPerson中的嵌套类。
  • 头文件是否相互包含,即是否存在循环依赖?