2012-05-17 92 views
1

問題更新:呼喚構造爲元素對象在父類的構造函數

我想要做的在C以下++:

struct Param { 
public: 
    int len; 
    int in1; 
    float in2; 
}; 

Param params; 

class Element { 
private: 
    int value1; 
    float value2; 
public: 
    Element(); 
    Element(int n) {value1 = n; value2 = 0;} 
    Element(int n1, float n2) {value1 = n1; value2 = n2;} 
} 

class Parent { 
private: 
    class Element elem; 
    vector<Element> elemVec; 
public: 
    Parent(); 
    Parent(int n); 
} 

我希望寫下面的構造,使得在調用Parent構造函數,類元素elemelemVec的非默認構造函數也被調用。我已經想通了,對於elem構造函數需要被調用如下:

Parent::Parent(int n) : elem(n) { 

} 

我現在該如何構建elemVec向量的每個元素,使得Element(int, float)構造函數被調用每個向量元素與intfloat值回升從結構字段params.value1params.value2開始。 elemVec的大小需要由struct字段params.len來定義。

在構造函數體中寫入一個循環會給構造對象帶來不希望的行爲。

+0

我需要一個通用的解決方案。賦給構造函數的輸入'numVec'不一定是int的向量,甚至可能不是向量。我僅以此爲例。 – vikaspraj

+0

你能列出'numVec'可能的類型嗎? – hmjd

回答

5

下面的實現應該工作。但是,它取決於從intElement的隱式轉換,而不是一個通用解決方案。

Parent::Parent(int n, const vector<int> &numVec) 
    : elem(n), 
     elemVec(numVec.begin(), numVec.end()) 
{ } 
+0

我需要一個通用的解決方案。賦給構造函數numVec的輸入不一定是int的向量,甚至可能不是向量。 – vikaspraj

+0

@vikaspraj:然後請用**實際**要求更新您的問題。 –

1

該解決方案你想要做什麼:

Parent::Parent(int n, const vector<int>& numVec) 
    : elem(n) 
{ 
    elemVec.reserve(numVec.size()); 
    for (auto num : numVec) 
     elemVec.emplace_back(num); 
} 

空載體的默認構造基本上是免費的。

該儲備分配完整的內存塊需要作爲一個向量(N)構造函數。

emplace_back儘可能有效地構建項目。

+0

爲什麼不'const vector &numVec'?這樣'vector'將被複制3次。 – Naszta

+0

複製和粘貼錯字 - 但是我不知道你從哪裏得到3次?在修復零次之後,該向量將被複制一次。 (或者如果你正在計數numVec-> elemVec作爲副本,比兩次,現在一次) –

+0

好的,是的。我也複製了文字。 :) – Naszta

相關問題