2011-12-27 56 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)) 
    }} 
{} 
相關問題