16

我有一个头文件啊,里面我声明了一个结构。该结构的名称是file。里面file我有3个成员:a,b,c。在 a.cpp 中,我实现了该结构并为该结构变量分配了一些值。

现在我有另一个文件 bh 在里面我有一个结构的前向声明file。直到此时,如果我编译它并没有显示错误,但是当我要通过该 b.cpp 类访问该结构中存在的变量时,它会给出类似“未定义结构”的错误。

我究竟做错了什么?

4

3 回答 3

21

错误的根本原因是什么?

当您 Forward 声明一个类型时,编译器会将其视为Incomplete type

前向声明告诉编译器所述类型存在,而没有更多关于特定类型的信息。因此,您不能对需要编译器知道其内存布局的类型 执行任何操作(如创建对象或取消引用指向该类型的指针)。

解决方案:

如果需要引用结构成员,则不能转发声明,您需要在源文件中包含头文件。这将确保编译器知道该类型的内存布局。您将不得不相应地设计您的项目。

于 2012-06-05T09:31:57.317 回答
11

要访问成员,需要完整的定义。您需要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
    }
};
于 2012-06-05T09:30:29.010 回答
0

您需要包含使用成员的结构的定义,否则编译器不知道它们是什么。

所以如果你有 b.cpp,这个

   func(mystruct &s)
   {
        s.a = 1;
   }

编译器在执行分配之前很好。此时,它试图在“mystruct”中找到“a”的定义,但找不到。

您应该 #include "a.h"在 b.cpp 中,或者可能,根据 ah 中的其他内容,您可能需要一个单独的结构标题并将其包含在内。

于 2012-06-05T09:38:41.933 回答