2017-06-06 103 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