2011-07-11 158 views
4

可能重複:
Intitialzing an array in a C++ class and modifiable lvalue problem默認值

this問題看到,有可能給一個構造函數的結構,使其成員得到默認值。你將如何繼續給一個結構內數組的每個元素賦予一個默認值。

struct foo 
{ 
    int array[ 10 ]; 
    int simpleInt; 
    foo() : simpleInt(0) {}; // only initialize the int... 
} 

是否有某種方法可以使這一行類似於如何初始化int?

+0

它似乎是C++。 –

+1

重新標記。繼續......':)' –

+0

@Francis:正如現在寫的,這段代碼在C中不起作用,因爲它使用了一個構造函數。構造函數是一個C++特性。 – unwind

回答

5

Thew新的C++標準有辦法做到這一點:

struct foo 
{ 
    int array[ 10 ]; 
    int simpleInt; 
    foo() : array{1,2,3,4,5,6,7,8,9,10}, simpleInt(0) {}; 
}; 

測試:https://ideone.com/enBUu

如果你的編譯器不支持此語法的是,你總是可以分配到陣列中的每個元素:

struct foo 
{ 
    int array[ 10 ]; 
    int simpleInt; 
    foo() : simpleInt(0) 
    { 
     for(int i=0; i<10; ++i) 
      array[i] = i; 
    } 
}; 

編輯:在2011年的預-C的一行的解決方案需要++不同的容器類型,例如C++矢量(其無論如何優選)或升壓陣列,其CA n爲boost.assign「編

#include <boost/assign/list_of.hpp> 
#include <boost/array.hpp> 
struct foo 
{ 
    boost::array<int, 10> array; 
    int simpleInt; 
    foo() : array(boost::assign::list_of(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)), 
      simpleInt(0) {}; 
}; 
+0

因此,這種類型的手術沒有_one liner_? – ALOToverflow

+0

@Francis - 「單行」是指「在ctor-initializer」中嗎?如果它是你正在尋找的「單線程」,只需要將ctor體提升到相同的線路上(我並不是很尖銳,只是想更好地理解你的評論) – Dan

+0

@丹 - 我指的是ctor-initializer – ALOToverflow

4

數組更改爲一個std ::向量將允許你做簡單的初始化,您將獲得使用載體的其他好處。

#include <vector> 
struct foo 
{ 
    std::vector<int> array; 
    int simpleInt; 
    foo() : array(10, 0), simpleInt(0) {}; // initialize both 
}; 
+0

您還將獲得使用矢量的底片。 – Moberg

2

如果你只是想爲默認初始化數組(設置內置類型爲0),你可以做這樣的:

struct foo 
{ 
    int array[ 10 ]; 
    int simpleInt; 
    foo() : array(), simpleInt(0) { } 
}; 
+0

沒有辦法分配0以外的默認值嗎? – ALOToverflow

+0

@Francis:不在C++ 0x之前,沒有。有關替代方案,請參閱其他答案。 – Nemo

1
#include <algorithm> 

struct foo 
{ 
    int array[ 10 ]; 
    int simpleInt; 
    foo() : simpleInt(0) { std::fill(array, array+10, 42); } 
}; 

或使用std::generate(begin, end, generator);了發動機你決定。