2009-07-17 73 views
3

1.同時聲明和初始化結構/類的數組

我知道可以在聲明中初始化結構數組。例如:

struct BusStruct 
{ 
    string registration_number; 
    string route; 
}; 

struct BusStruct BusDepot[] = 
{ 
    { "ED3280", "70" }, 
    { "ED3536", "73" }, 
    { "FP6583", "74A" }, 
}; 

如果該結構被改變成一個類,如下所示:

class BusClass 
{ 
protected: 
    string m_registration_number; 
    string m_route; 
public: 
    // maybe some public functions to help initialisation 
}; 

是否有可能做同樣的作爲結構(即聲明和初始化類的陣列同一時間)?

2. 我認爲無法同時聲明並初始化vector<BusStruct>vector<BusClass>嗎?

+0

如果你正在處理任何類型的數據可能可能也許最終在任何可能持續較長時間的軟件中進行更改,任何將數據與代碼分離的方法都是可取的。文本文件,SqlLite,XmlFiles,Google Protobuffers等是您可能想要查看的一些可能性 – 2009-07-17 17:49:19

回答

3

是否可以做同樣的結構(即同時聲明和初始化一個類的數組)?

除非你創建一個合適的構造函數:

class BusClass 
{ 
protected: 
    string m_registration_number; 
    string m_route; 
public: 
    // maybe some public functions to help initialisation 
    // Indeed: 
    BusClass(string const& registration_number, 
      string const& route) 
    :m_registration_number(registration_number), 
    m_route(route) { } 
}; 

或者你讓所有成員公開,並省略構造,在這種情況下,你可以使用相同的初始化語法的結構。但我認爲那不是你想要的。

我正確地認爲不可能同時聲明並初始化vector<BusStruct>vector<BusClass>嗎?

不,目前的C++是不可能的。但是,您可以使用使這成爲可能的庫。我爲此推薦Boost.Assign。對於這一點,但是,你的類必須有一個構造函數,同樣你的結構太 - 或者你需要創建某種工廠函數

BusStruct make_bus(string const& registration_number, 
        string const& route) { ... } 

的。如果你想保持與括號內的初始化列表中的結構initializable在其他情況下。

+0

感謝您的解釋和更新我的原始帖子(使矢量可見的位)。我並不介意它是公開還是保護,但你對boost庫的建議是好的。我會看看。 – Andy 2009-07-17 16:19:25

1
  1. 不,你不能以結構的方式初始化類。但是你可以在數組聲明中寫入類構造函數。
  2. 除非要從已初始化的數組中加載向量,否則C++沒有內置的向量初始化方法。
+0

謝謝您的回答。它證實了我的懷疑,現在我需要找到一種方法來初始化它們。 – Andy 2009-07-17 16:00:51

0

C++本身支持兩種形式的向量初始化,您也不需要尋找。

1:每一個元素都一樣:

vector<int> ints(4,1000); //creates a vector of 4 ints, each value is 1000. 

2:從現有載體複製爲:

vector<int> original(3,1000); //original vector has 3 values, all equal 1000. 
vector<int> otherVector(original.begin(),original.end()); //otherVector has 3 values, copied from original vector 
+0

你是對的,但不幸的是我不想發起所有具有相同初始值的元素! – Andy 2009-07-20 15:27:34