【问题标题】:Calling constructors for element objects in the constructor of a parent class在父类的构造函数中调用元素对象的构造函数
【发布时间】:2012-05-17 09:56:21
【问题描述】:

问题更新:

我想在 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 向量的每个元素,以便使用从结构字段params.value1params.value2 提取的intfloat 值对每个向量元素调用Element(int, float) 构造函数. elemVec的大小需要通过struct字段params.len来定义。

在构造函数主体中编写循环会导致构造对象的不良行为。

【问题讨论】:

  • 我需要一个通用的解决方案。给构造函数的输入numVec 不必是整数向量,甚至可能不是向量。我以这个案例为例。
  • 你能列出numVec可能的类型吗?

标签: c++ constructor parent-child


【解决方案1】:

以下实现应该可以工作。但是,它依赖于从intElement的隐式转换,并不是一个通用的解决方案。

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

【讨论】:

  • 我需要一个通用的解决方案。给构造函数numVec 的输入不必是整数向量,甚至可能不是向量。
  • @vikaspraj:那么请根据实际要求更新您的问题。
【解决方案2】:

此解决方案可以满足您的需求:

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

空向量的默认构造基本上是免费的。

储备分配所需的完整内存块,就像 vector(n) 构造函数一样。

emplace_back 尽可能高效地构建项目。

【讨论】:

  • 为什么不const vector&lt;int&gt; &amp;numVec?这样vector就会被复制3次。
  • 复制和粘贴错字已修复 - 但是我不知道你从哪里得到 3 次?在修复零次之后,向量将被复制一次。 (或者如果您将 numVec->elemVec 算作副本,则比两次,现在一次)
  • 好的,是的。我也只是复制了文本。 :)
猜你喜欢
  • 2018-01-31
  • 2018-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 2011-12-07
  • 2019-03-14
相关资源
最近更新 更多