【问题标题】:c++ how does a class derived from a template call the template's constructor?c++从模板派生的类如何调用模板的构造函数?
【发布时间】:2013-03-15 16:43:40
【问题描述】:

我真的不知道如何调用这个线程。 情况如下。我有一个模板类Array<T>

template <typename T> class Array{
private:
    T* m_cData;
    int m_nSize;
    static int s_iDefualtSize;
public:
    Array();
    Array(int nSize);
}

现在,我想编写一个派生自Array&lt;T&gt; 的专用类,包含class Boxes 的对象:

class Boxes{
private:
    double m_dFull;
public:
    Boxes(double dFull=0): m_dFull(dFull) {}
};

我这样做的方式如下:

class BoxesArray : public Array<Boxes>{
public:
    BoxesArray() : Array<Boxes>::Array() {}
    BoxesArray(int nValue) : Array<Boxes>::Array(nValue) {}
}

我添加了一些专门用于Boxes 的额外功能。好的,所以这是第一个混乱。调用ArrayBoxes() 似乎实例化了一个对象数组并“准备”这个对象来保存盒子,对吧?但是,在创建和对象ArrayBoxes 之后,它是如何发生的(即上面代码的哪一部分)我已经用 Boxes 填充了它?而且,第二个问题,我可以看到填充 ArrayBoxes 的这些 Boxes 是使用 Boxes 的默认构造函数构造的(Boxes m_dFull 被设置为 0)但是如果我希望 ArrayBoxes 默认使用参数构造函数实例化呢?盒子(例如,盒子m_dFull = 0.5)?希望所有的编辑我的问题现在都清楚了。

【问题讨论】:

  • 你不必调用你父类的默认构造函数,它会被隐式调用。
  • Array&lt;T&gt;的默认构造函数是做什么的?我们能看到吗?听起来您也不清楚继承的含义。 ArrayBoxes 是一个Array&lt;Boxes&gt;,所以无论你在Array&lt;Boxes&gt; 默认构造函数中所做的一切都会影响ArrayBoxes
  • 考虑到Array&lt;Boxes&gt;::Array() 没有参数,我正在努力理解为什么ArrayBoxes() {} 不起作用,

标签: c++ templates constructor template-specialization


【解决方案1】:

您需要将代码以满足您的要求的Boxes 填充数组在默认构造函数的主体中,或者调用Array&lt;Boxes&gt; 的非默认构造函数,该构造函数采用您想要的Boxes 实例在成员初始化列表中。

【讨论】:

    【解决方案2】:

    但是它是如何发生的(即上面代码的哪一部分)在创建和对象 ArrayBoxes 之后我已经用 Boxes 填充了它?

    您的BoxesArray 构造函数似乎调用了Array&lt;Boxes&gt; 构造函数。即使没有,C++ 也会为您隐式调用它。

    而且,第二个问题,我可以看到填充 ArrayBoxes 的这些 Boxes 是使用 Boxes 的默认构造函数构造的(Boxes m_dFull 被设置为 0)但是如果我希望 ArrayBoxes 默认使用参数实例化怎么办? Boxes 的构造函数(例如,Boxes m_dFull = 0.5)?

    您需要在Array&lt;T&gt; 中添加这样的构造函数: Array(int nsize, double defval);

    您将在内部构造数组,其中包含调用默认值的框。

    【讨论】:

      猜你喜欢
      • 2014-09-23
      • 1970-01-01
      • 1970-01-01
      • 2021-04-20
      • 1970-01-01
      • 2011-10-05
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多