我有一个头文件啊,里面我声明了一个结构。该结构的名称是file
。里面file
我有3个成员:a,b,c。在 a.cpp 中,我实现了该结构并为该结构变量分配了一些值。
现在我有另一个文件 bh 在里面我有一个结构的前向声明file
。直到此时,如果我编译它并没有显示错误,但是当我要通过该 b.cpp 类访问该结构中存在的变量时,它会给出类似“未定义结构”的错误。
我究竟做错了什么?
我有一个头文件啊,里面我声明了一个结构。该结构的名称是file
。里面file
我有3个成员:a,b,c。在 a.cpp 中,我实现了该结构并为该结构变量分配了一些值。
现在我有另一个文件 bh 在里面我有一个结构的前向声明file
。直到此时,如果我编译它并没有显示错误,但是当我要通过该 b.cpp 类访问该结构中存在的变量时,它会给出类似“未定义结构”的错误。
我究竟做错了什么?
错误的根本原因是什么?
当您 Forward 声明一个类型时,编译器会将其视为Incomplete type。
前向声明告诉编译器所述类型存在,而没有更多关于特定类型的信息。因此,您不能对需要编译器知道其内存布局的类型 执行任何操作(如创建对象或取消引用指向该类型的指针)。
解决方案:
如果需要引用结构成员,则不能转发声明,您需要在源文件中包含头文件。这将确保编译器知道该类型的内存布局。您将不得不相应地设计您的项目。
要访问成员,需要完整的定义。您需要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
}
};
您需要包含使用成员的结构的定义,否则编译器不知道它们是什么。
所以如果你有 b.cpp,这个
func(mystruct &s)
{
s.a = 1;
}
编译器在执行分配之前很好。此时,它试图在“mystruct”中找到“a”的定义,但找不到。
您应该 #include "a.h"
在 b.cpp 中,或者可能,根据 ah 中的其他内容,您可能需要一个单独的结构标题并将其包含在内。