2014-03-18 158 views
0
class Foo{ 
static vector<Point> vec[3]; 
}; 

所以我有一個三個向量的數組。我需要在編譯時初始化每個向量。如何初始化C++中的靜態向量數組成員

例如東西,看起來像這樣:

vec[0] = { {1,2}, {3,4}}; // contain two points 
vec[1] = { {0, 0}};  // contain one point 
vec[2] = {};    // empty 

是否有可能做到這一點?

回答

1

您需要使用intialization列表

在cpp文件

宣佈它在cpp文件:

vector<Poiint> Foo::vec={Point(1,2,3), Point(4,5,6), Point(8,9,10)}; 

其中點(x,y,z)是構造函數,因此它將填充有三個元素

在類載體,你應該聲明它像:

static vector<Point> vec; 
+1

謝謝你的提示,但我的意思是有三個矢量(如數組),而不是一個:) – Diaz

0

一解決方法是添加一個內部靜態類_init(以您喜歡的方式命名),其構造函數執行實際的初始化。

Class Foo{ 
public: 
static int bar; 
static class _init{ 
public _init(){// do something to bar} 
} Initializer; 
}; 

// --- in .cpp 
// define 'bar' and 'Initializer' 

因此,初始化器的構造函數將被調用來初始化欄。

0

它看起來像用意更像是:

static vector < vector<Point> > vec; 


如果是這樣,那麼用在C++ 11,Windows 64位C++ Builder的編譯和運行,一些短期測試獲得期望的結果。 (?類)作爲附加實驗,定義爲點參數少,並通過價值構造後鍵入本例中使用,在多維VEC作品調用的push_back還有:

vec.push_back({{1,2}, {3,4}}); 
vec.push_back({{0,0}}); 
vec.push_back({{4,5}}); 

我相信的理由類可以忽略是因爲多維vec矢量已被聲明爲存儲實例。上面的OP中傳遞一個空點的最後一行並沒有達到任何效果,正如遍歷vec時可以看到的那樣。第三個元素(索引二)不會打印一個東西。已經添加了{4,5} 來測試遍歷vec的所有索引。請注意,在push_back的調用中有兩組大括號。如果沒有外層花括號,編譯器錯誤會提示「沒有與push_back調用相匹配的成員函數」。

示例代碼來遍歷多維矢量(例​​如矩陣或陣列):

// 
// Declared a typedef to separate the vector row and the whole matrix 
// Makes it simpler to traverse each vector row later. intVals is a 
// test class with public integer elements "a" and "b". The intVals 
// class substitutes for the Point type in the OP above. 
// 
typedef vector<intVals> vec_t; 
vector<vec_t> matrix; 


int jj; 
for (int i = 0; i < 3; i++) 
{ 
    jj = 0; 
    for (vec_t::iterator j = matrix[i].begin(); j != matrix[i].end(); j++) 
    { 
     cout << "Matrix at index: " << i << ", element: " << jj << " a = " << (*j).a; 
     cout << " b = " << (*j).b << endl; 
     jj++; 
    } 
}             


注意,外環在三個夾緊。真正的實現可以使用matrix :: iterator(或者範圍)。

有關多維向量的其他參考,請參見multidimensional vector, how to論壇發帖。

0
vec[0] = { {1,2}, {3,4}}; 

由於沒有矢量構造函數需要可變數量的對象(在C++ 11中支持initializer_list),所以這不起作用。

要解決這個問題,你可以用一對數組做到這一點:

Point v1[2] = {Point(1,2), Point(3,4)}; 
    Point v2[1] = {Point(0.0)}; 

vector<Point> Foo::vec[] = {vector<Point>(v1, v1+2), vector<Point>(v2, v2+1), vector<Point>()}; 

它使用矢量構造函數的開始和結束迭代器來構建其載體。

在C++ 11,我想你可以這樣來做:

vector<Point> Foo::vec[] = {{Point(1,2), Point(3,4)}, {Point(0,0)}, {}};