2016-08-01 163 views
2

當編譯如下代碼:在構造函數中初始化嵌套成員的語法?

foo.h中

#include <memory> 
#include <vector> 

struct external_class; 

struct A { 
    struct B { 
     std::vector<external_class> bad_vector; 
    }; 
    std::vector<external_class> good_vector; 
    std::shared_ptr<B> b; 
    A(); 
}; 

Foo.cpp中:與-Weffc++標誌(GCC)

#include "foo.h": 

struct external_class {};  // implement external_class 

A::A() : 
    good_vector(),   // <- easy to initialize via default constructor 
    b(std::make_shared<B>()) // <- does not involve bad_vector::ctor -> warning 
{ } 

int main() { A a; } 

..我得到的警告

foo.cpp:9:12: warning: ‘A::B::bad_vector’ should be initialized in the member initialization list [-Weffc++] 
    struct B { 
      ^

這對我來說是完全清楚的,但我不知道該如何擺脫它。

對於依賴的原因,我需要向前聲明爲external_class,所以在類初始化是不可能的。我能爲A::B提供一個構造函數和實現它裏面foo.cpp但我還是希望有通過提供A::B::bad_vector的初始化(類似於A::good_vector)來初始化A::b很短的方式。

是嗎?什麼是語法(我應該用Google尋找解決方案?)或者我必須提供B的構造函數嗎?

+2

@juanchopanza [not true](http://eel.is/c++draft/vector#overview-3) – Barry

+0

也許我必須添加一個東西:'A :: good_vector'真的會是一個問題,沒有實際的定義。在我的例子中,它只顯示了我想要初始化'A :: B :: bad_vector'的方式。 – frans

回答

5

你的代碼是正確的。

該警告基本上是關於B沒有明確默認初始化bad_vector的構造函數。但B的默認構造函數已經默認初始化爲bad_vector。即使B() = default;不會使警告無效,您實際上必須寫出B() : bad_vector() { }。對我來說,暗示-Weffc++可能在C++ 11中過時。

+0

所以沒有初始化'A :: A()內'A :: B :: bad_vector'辦法'通過什麼_like_爲'A :: B'的初始化列表? – frans

+0

爲什麼不會有? a)用戶定義的構造函數b)聚合初始化 – LogicStuff

+0

在本例中聚合初始化看起來如何?我認爲這個術語是我一直在尋找的,但我如何在這種情況下做到這一點。 – frans

相關問題