2011-12-27 37 views
4

下面是我有一个问题的代码:我怎样才能初始化一个成员std ::没有默认构造函数的对象的数组?

class Foo { 
public: 
    Foo() : 
     memberArray{Bar(1), Bar(3), Bar(2)} 
    {} 
    struct Bar { 
     Bar(int param1) { } 
    }; 
private: 
    std::array<Bar,3> memberArray; 
// Bar memberArray[3]; // Using a raw array like this instead compiles fine.. 
}; 

我使用GCC 4.6.1,和编译的C++ 11。有谁知道我应该如何初始化我的std ::数组?

+0

相关:http://stackoverflow.com/questions/8646088/how-can-i-initialise-a-member-array-of-objects-that-dont-have-a-default-constuc – 2011-12-27 15:49:27

+0

@LightnessRacesinOrbit这不是一个笨蛋...他试图初始化一个成员,但是这个问题初始化一个局部变量。后者可以省略支架,但前者不能。 – 2012-01-14 15:44:47

+0

@Johannes:我从来没有说过它是一个dup。我说这是相关的。 – 2012-01-14 21:03:14

回答

2

作为一种解决方法,您可以让函数返回此数组的一个实例。

#include <array> 

class Foo { 
public: 
    Foo() : 
     memberArray(makeMemberArray()) 
    {} 
    struct Bar { 
     Bar(int param1) { } 
    }; 
private: 
    std::array<Bar,3> memberArray; 
// Bar memberArray[3]; // Using a raw array like this instead compiles fine.. 

    static std::array<Bar, 3> makeMemberArray() { 
     std::array<Bar,3> a = {Bar(1), Bar(2), Bar(3)}; 
     return a; 
    } 
}; 

我认为统一初始化应该允许你在做什么,除了它可能不会被编译器实现。

-4

尝试此(它为克++ 4.5.2):

Foo() : 
     memberArray (std::array<Bar,3> {Bar(1), Bar(3), Bar(2)}) 
    {} 
+1

@ildjarn:这有点儿幼稚的你,因为我发布了工作代码而降低了我的答案。 – TonyK 2011-12-28 00:43:13

+4

假设我是唯一愿意降低错误答案的人(并且您确实需要了解“工作”的实际定义),这有点孩子气。对不起,让你失望。 – ildjarn 2011-12-28 04:11:59

5

array<T, N>由于实际上是一个结构中,完全支撑版本需要{{ .. }}(内的有用于array<T, N>对象的阵列部件) 。该规范不允许在这里进行大括号切割。它仅允许它在形式

Type var = { ... }; 

所以,你必须使用完全支撑语法

Foo() : 
    memberArray{{Bar(1), Bar(3), Bar(2)}} 
{} 

这是不是一个错误的GCC的声明,而是通过规范所要求的。

+0

但是这并没有编译,至少对于g ++ 4.5.2来说。它说:错误:没有匹配函数调用'std :: array :: array(<括号内部初始化列表>)' – TonyK 2011-12-27 17:20:22

+1

@TonyK:我们正在讨论什么是或不是' t合法的语法,而不是编译器实现的缺陷。 – ildjarn 2011-12-27 20:32:22

+0

@ildjarn:所以你认为我的评论是无关紧要的?这是一个奇怪的位置。 – TonyK 2011-12-27 20:38:46

0

大厦约翰内斯·绍布 - litb的答案......至少GCC将允许你使用缩写语法(而忽略了,没有意义,类名):

Foo() : 
    memberArray{{ {1}, {3}, {2} }} 
{} 

,而不是

Foo() : 
    memberArray{{Bar(1), Bar(3), Bar(2)}} 
{} 

我个人而言,只有使用这样的,当我初始化多态指针数组的第二个版本:

Foo() : 
    memberArray{{ 
     dynamic_cast<Bar*>(new BarA(1)), 
     dynamic_cast<Bar*>(new BarB(3)), 
     dynamic_cast<Bar*>(new BarC(2)) 
    }} 
{} 
相关问题