2016-08-01 110 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

相关问题