字段在前向声明中具有不完整类型

时间:2017-06-06 11:13:02

标签: c++ forward-declaration

我使用以下简单文件重现错误。

它说:

字段的类型不完整'Foo'

bar.h:

class Foo;

class Bar{
    private:
        int x_;
        Foo foo_; // error: incomplete type

    public:
        void setx(int x) {x_ = x;};
        void increment(int);

};


class Foo{

public:
    void run(int y,Bar& bar) {bar.setx(y);};
};

void Bar::increment(int i){foo_.run(i,*this);}

成员 foo _ 不得是引用或指针。原因是在我的实际代码中,我无法在Bar的初始化列表中初始化Foo。

2 个答案:

答案 0 :(得分:7)

您的问题可以简化为:

class Foo;

class Bar{
    Foo foo_; // error: incomplete type
};

在这里你做了类型Foo的前向声明,即没有完整定义的声明:在C ++中声明指针是足够的,但不像Bar中那样具体实例。< / p>

为您的班级提供完整的定义:

class Foo{
    // put details here
};

class Bar{
    Foo foo_; // OK
};

或使用(智能)指针,例如:

class Foo;

class Bar{
    std::unique_ptr<Foo> foo_; // OK
};

或按Bartek Banachewicz指示更改订单声明。

答案 1 :(得分:4)

在这种情况下,它很简单:由于Foo仅使用对Bar的引用,因此将它们翻转就可以解决问题:

class Bar; 

class Foo{
public:
    void run(int y,Bar& bar);
};

class Bar { ... };

void Foo::run(int y, Bar& bar) {
    bar.setx(y);
}

您还需要移动Foo::run的正文,因为它实际上是使用Bar成员函数。