我有一个头文件a.h,在里面我声明了一个结构。该结构的名称为file
。在file
里面我有3个成员:a,b,c。在a.cpp中,我实现了该结构并为该结构变量赋予了一些值。
现在我有另一个文件b.h.在其中我有一个结构file
的前向声明。在此之前,如果我编译它没有显示错误,但是当我要通过该b.cpp类访问该结构中存在的变量时,它将给出类似“undefined struct”的错误。
我做错了什么?
答案 0 :(得分:13)
错误的根本原因是什么?
当您转发声明类型时,编译器会将其视为不完整类型。
前向声明告诉编译器存在所述类型,并且没有更多关于特定类型的内容。因此,您不能执行任何操作(如创建对象,或取消引用指向该类型的指针)需要编译器知道其内存布局的类型。
解决方案:
如果需要遵循结构成员,则无法转发声明。您需要在源文件中包含头文件。这将确保编译器知道该类型的内存布局。您必须相应地设计项目。
答案 1 :(得分:4)
要访问成员,需要完整定义。您需要include
b.cpp
内的标头,而不仅仅是向前声明struct
(这会产生不完整的类型)。
编辑:
前向声明足以:
class B;
class C
{
B& b;
B* b;
B foo();
foo(B b);
};
但不适用于
class B;
class C
{
B b; //ERROR
B foo()
{
B x; //error
x.whatever(); //error
return B(); //error
}
};
答案 2 :(得分:0)
您需要包含使用成员的结构定义,或者编译器不知道它们是什么。
所以,如果你有b.cpp,这个
func(mystruct &s)
{
s.a = 1;
}
编译器可以正常进行分配。此时,它试图在'mystruct'中找到'a'的定义,但找不到它。
你应该在b.cpp中#include "a.h"
,或者可能,根据a.h中的其他内容,你可能需要一个单独的结构头,并包含它。