2012-05-17 91 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

相关问题