"对象"未被声明为错误

'Object' has not been declared error

本文关键字:错误 声明 对象      更新时间:2023-10-16

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

在c++中,将声明与定义分开是一件大事。声明告诉我们如何使用代码,并且在头文件(.h)中。定义是代码本身,并且在源代码(.cpp)文件中。

如果一个文件只通过指针或引用引用Transaction(这在头文件中很常见),那么你只需要预先声明事务类,用class Transaction;。如果文件需要一个实际的Transaction值,那么您需要#include "Transaction.h"

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

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

class Person {
public:
    class Transaction;
};

声明一个完全限定名为Person::Transaction的类。即使在全局作用域中存在另一个名为Transaction的类,对Transaction的引用也会被假定为引用Person::Transaction。因为你还没有定义这个类,所以你会得到这个错误。

你想要的是::Transaction,要么包括头文件,要么在你的类声明之外向前声明。要么做

class Transaction;
class Person {
};

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

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

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

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

您必须包含定义Transaction的头文件(如果您将使用指针,那么您可以在h文件中转发声明Transaction类,并仅在实现文件中包含Transaction.h)。

#include "Transaction.h"在你的文件的顶部应该可以做到这一点。

感谢张贴更多的代码。试试这个:

  1. 在person.h文件的顶部放置:class Transaction
  2. 在person.cpp文件中,在顶部放置:#include "Transaction.h"

希望能有所帮助