“对象”尚未声明错误

时间:2011-10-21 17:45:20

标签: c++ object parameters syntax-error declaration

我是来自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_ */

6 个答案:

答案 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吗?这意味着TransactionPerson中的嵌套类。
  • 头文件是否相互包含,即是否存在循环依赖?

答案 3 :(得分:1)

你必须包含定义Transaction的头文件(如果你曾经使用过指针,那么你只需要在你的h文件中转发声明Transaction类,并且只在实现文件中包含Transaction.h)。 / p>

答案 4 :(得分:0)

#include "Transaction.h"位于文件顶部应该可以解决问题。

答案 5 :(得分:0)

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

  1. 在person.h文件中,顶部放置:class Transaction
  2. 在person.cpp文件中,顶部放置:#include "Transaction.h"
  3. 希望这有帮助