结构的前向声明

时间:2012-06-05 09:29:17

标签: c++

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

现在我有另一个文件b.h.在其中我有一个结构file的前向声明。在此之前,如果我编译它没有显示错误,但是当我要通过该b.cpp类访问该结构中存在的变量时,它将给出类似“undefined struct”的错误。

我做错了什么?

3 个答案:

答案 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中的其他内容,你可能需要一个单独的结构头,并包含它。