使用/ multiple指针复制构造函数

时间:2014-10-03 21:40:14

标签: c++ copy-constructor

我正在尝试使用指针变量为类创建一个复制构造函数。虽然复制结构出了问题,但当我尝试在新对象中访问指针时会出现段错误...

/* Copy Constructor */ 
Solver::Solver(const

 Solver &obj)
    {
    // Pointers to use in modified-Midpoint method.
    double *m_yTemp1 = new double[CONST_numVariables];
    double *m_yTemp2 = new double[CONST_numVariables];
    double *m_dTemp  = new double[CONST_numVariables];

    // Triple pointer to store tableau of data for extrapolation.
    double ***m_extrapTableau = new double**[CONST_maxDiv];
    *m_extrapTableau          = *obj.m_extrapTableau;
    for(int i=0; i<CONST_maxDiv; i++)
    {
        m_extrapTableau[i]  = new double*[i+1];
        *m_extrapTableau[i] = *obj.m_extrapTableau[i];
        for(int j=0; j<=i; j++)
        {
            m_extrapTableau[i][j]  = new double[CONST_numVariables];
            *m_extrapTableau[i][j] = *obj.m_extrapTableau[i][j];
        }
    }
    // Pointer of step sizes for extrapolation of modified-Midpoint.
    double *CONST_extrap = new double[CONST_maxDiv];
    for(int i=0; i<CONST_maxDiv; i++)
    {
        CONST_extrap[i] = 2.*(i+1.);
    }

    // Change pointer of new object from already used memory to newly allocated. 
    *m_yTemp1     = *obj.m_yTemp1;
    *m_yTemp2     = *obj.m_yTemp2;
    *m_dTemp      = *obj.m_dTemp;
    *CONST_extrap = *obj.CONST_extrap;
}

我最初的问题是:

  1. 如果我在类中有其他非指针变量,它们是自动复制还是我还需要指定它们?
  2. 如何处理传递双指针或三指针的地址?我想我可能做错了。
  3. 如果CONST_numVariables和CONST_maxDiv是在类中设置的常量,它们是否可以在此复制构造函数中使用,假设它们在复制对象时已设置?

1 个答案:

答案 0 :(得分:0)

您的段错误存在问题:

double ***m_extrapTableau = new double**[CONST_maxDiv];  // (1)
*m_extrapTableau          = *obj.m_extrapTableau;        // (2) 

在(1)中,您将变量m_extrapTableau LOCAL声明为构造函数 但是在(2)中我可以看到你有一个同名的类元素。因此,构造函数的本地m_extrapTableau将被正确地初始化。但它隐藏了类成员,该成员将继续未初始化以供后续使用。

关于你剩下的问题:

1)如果您实现了复制构造函数,则必须注意复制所需的所有内容。

2)传递double或tripple指针的地址需要您在使用表的任何元素之前迭代初始化指针的每个级别。您应该考虑使用矢量矢量或矢量矢量矢量。这些更容易初始化,复制等......

3)如果它们是const并且你没有用支撑初始化器将它们初始化为另一个值,那么它们应该是可用的。