"对象"未被声明为错误
'Object' has not been declared error
我是来自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
中吗?这意味着Transaction
是Person
的嵌套类。 - 头文件是否相互包含,即是否存在循环依赖?
您必须包含定义Transaction的头文件(如果您将使用指针,那么您可以在h文件中转发声明Transaction类,并仅在实现文件中包含Transaction.h)。
#include "Transaction.h"
在你的文件的顶部应该可以做到这一点。
感谢张贴更多的代码。试试这个:
- 在person.h文件的顶部放置:
class Transaction
- 在person.cpp文件中,在顶部放置:
#include "Transaction.h"
希望能有所帮助
- 错误:未在此范围内声明'reverse'
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 错误:"imread"未在此范围内声明
- 在气泡排序程序中未声明错误功能
- 使用全局声明的向量时,C++双重释放错误/损坏
- 使用直接大括号初始化时,C++ 编译错误"声明末尾的预期";"
- C++ [错误] 声明'char '隐藏参数。什么意思?
- 类中的静态函数给出了错误:声明中的两种或多个数据类型
- 错误:声明冲突 - 指针不能是 int
- 收到 CUDA 错误"声明与以前的"variable_name"不兼容
- 错误:声明不声明
- Visual Studio 2010 链接器错误C++声明我从头文件创建的类时
- Cython 错误:声明不声明任何内容
- 错误"声明非模板函数"C++
- 无效地使用不完整的类型/前向错误声明.可能误用抽象类?(c++)
- 错误:声明冲突.用c++编译c代码
- C++错误:声明中存在显式限定
- else语句(C++)上的错误w/声明
- 初始化const类成员,错误:声明没有声明任何内容