前向声明,不完整类型

时间:2015-08-08 21:29:53

标签: c++

我正在接受

  

不允许使用不完整类型

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

以下是代码:

foo.h中:

#pragma once

class Bar;

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();
}

Bar.h:

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

    int getVal();
};

Bar.cpp:

#include "Bar.h"

Bar::Bar() {}

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

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

2 个答案:

答案 0 :(得分:3)

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

Foo.cpp中:

#include "Foo.h"
#include "Bar.h"

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

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

或在标题Bar.h

中添加标题Foo.h

foo.h中:

#pragma once
#include "Bar.h"

class Foo {
    const Bar &mBar;

public:
    Foo(const Bar &bar);

    int getVal() const;
};

考虑到函数Bar::getVal必须具有限定符const

int getVal() const;

否则你会再遇到一个编译错误,因为这个非const函数是从类Foo的const函数调用的。

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

答案 1 :(得分:2)

从编译器的角度思考。在编译源文件Foo.cpp并进入语句mBar.getVal()时,它不知道mBar的成员!它只知道mBar是对一个const Bar对象的引用。但是,如果没有使Bar类定义对编译器可见,则无法访问它的成员。

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