2017-06-06 101 views
0

我使用以下简单文件重现错误。字段在前向声明中具有不完整类型

它说:

领域具有不完全类型 '富'

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。

+0

要声明一个类的*实例*,需要该类的完整定义。另一方面,为了声明一个参考,一个前向声明就是所需要的。我建议你尝试一下你的类和成员函数定义的顺序。 –

+0

*我无法在Bar的初始化列表中初始化Foo。*然后您无法在Bar中创建'Foo'的实例。 –

回答

3

在这种情况下,它很简单:因为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

3

你的问题可以减少到这一点:

class Foo; 

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

这里你为Foo型,即没有一个完整的定义声明的向前声明:这足够在C++声明指针,而不是一个具体的像你在Bar中做的那样。

要么给一个完整的定义到类:

class Foo{ 
    // put details here 
}; 

class Bar{ 
    Foo foo_; // OK 
}; 

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

class Foo; 

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

或更改顺序声明由Bartek Banachewicz如指出。

+0

帮助很大,谢谢! ;) – beginneR