C++ 转发声明,不完整类型

C++ 转发声明,不完整类型,c++,C++,我得到了 不允许使用不完整的类型 错误。很明显,我不明白前向声明是如何工作的。我知道我不能在头文件中使用方法,但在实现中又如何呢 代码如下: Foo.h: #pragma once class Bar; class Foo { const Bar &mBar; public: Foo(const Bar &bar); int getVal() const; }; #pragma once #include "Bar.h" class Foo {

我得到了

不允许使用不完整的类型

错误。很明显,我不明白前向声明是如何工作的。我知道我不能在头文件中使用方法,但在实现中又如何呢

代码如下:

Foo.h:

#pragma once

class Bar;

class Foo {
    const Bar &mBar;

public:
    Foo(const Bar &bar);

    int getVal() const;
};
#pragma once
#include "Bar.h"

class Foo {
    const Bar &mBar;

public:
    Foo(const Bar &bar);

    int getVal() const;
};
Foo.cpp:

#include "Foo.h"

Foo::Foo(const Bar &bar) : mBar(bar) {}

int Foo::getVal() const {
    return mBar.getVal();
}
#include "Foo.h"
#include "Bar.h"

Foo::Foo(const Bar &bar) : mBar(bar) {}

int Foo::getVal() const {
    return mBar.getVal();
}
B.h:

#pragma once
class Bar {
public:
    Bar();

    int getVal();
};
Bar.cpp:

#include "Bar.h"

Bar::Bar() {}

int Bar::getVal() {
    return 5;
}

导致错误的原因是mBar.getVal()。然而,它在实现文件中。这也是不允许的吗?

包括在文件
Foo.cpp
标题
Bar.h

Foo.cpp:

#include "Foo.h"

Foo::Foo(const Bar &bar) : mBar(bar) {}

int Foo::getVal() const {
    return mBar.getVal();
}
#include "Foo.h"
#include "Bar.h"

Foo::Foo(const Bar &bar) : mBar(bar) {}

int Foo::getVal() const {
    return mBar.getVal();
}
或者在标题
Foo.h

Foo.h:

#pragma once

class Bar;

class Foo {
    const Bar &mBar;

public:
    Foo(const Bar &bar);

    int getVal() const;
};
#pragma once
#include "Bar.h"

class Foo {
    const Bar &mBar;

public:
    Foo(const Bar &bar);

    int getVal() const;
};
考虑到函数
Bar::getVal
必须具有限定符const

int getVal() const;
否则,您将获得另一个编译错误,因为此非常量函数是从类Foo的常量函数调用的

int Foo::getVal() const {
    return mBar.getVal();
    //     ^^^^^^^^^^^ 
}

从编译器的角度思考。当它编译源文件
Foo.cpp
时,遇到语句
mBar.getVal()
,它根本不知道mBar的成员!它只知道mBar是对const-Bar对象的引用。但如果不使Bar类定义对编译器可见,则无法访问其成员

通常,您会在头文件中转发声明,以避免拉入过多的头文件(如果头文件是外部可见API的一部分,这一点很重要)。在源文件中,您应该包括包含类定义的头文件;在这种情况下,
Bar.h