结构的前向声明

Ken*_*nta 5 c++

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

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

我究竟做错了什么?

Alo*_*ave 13

错误的根本原因是什么?

当您转发声明类型时,编译器会将其视为不完整类型.

前向声明告诉编译器存在所述类型,并且不再存在关于特定类型的内容.因此,您无法对该类型执行任何需要编译器知道其内存布局的操作(如创建对象或解除引用该类型的指针).

解:

如果需要遵循结构成员,则无法转发声明.您需要在源文件中包含头文件.这将确保编译器知道该类型的内存布局.您必须相应地设计您的项目.

  • 可能值得一提的是,不完整类型有时用于封装API.它们有效地强制用户仅通过公开的API函数访问结构.因此,替代方案可能是他添加所需的API函数而不是直接访问成员. (2认同)

Luc*_*ore 10

要访问成员,需要完整定义。您需要include在 内的标头b.cpp,而不仅仅是向前声明struct(这会产生不完整的类型)。

编辑:

前向声明足以用于:

class B;
class C
{
    B& b;
    B* b;
    B foo();
    foo(B b);
};
Run Code Online (Sandbox Code Playgroud)

但不是为了

class B;
class C
{
    B b;   //ERROR
    B foo()
    {
        B x; //error
        x.whatever(); //error
        return B(); //error
    }
};
Run Code Online (Sandbox Code Playgroud)