【问题标题】:How to initialize dynamic array inside a class?如何在类中初始化动态数组?
【发布时间】:2019-10-03 04:21:16
【问题描述】:

我希望在一个类中初始化一个多维动态数组。但是,我遇到了一个错误。

我在网上看过几个例子。他们似乎很难。我是编码新手。如果可能的话,我想要一个简单的解决方案。

class myp
{
    int ntc = 5;
    public:
    double** y = new double*[ntc];
    for(int i = 0; i < ntc; ++i)
        y[i] = new int[3];
};
int main()
{
    int x;
    myp mp;
    mp.y[1][1] = 3;
    cout<<mp.y[1][1]<<endl;;
    return 0;
}

test.cpp:12:2: error: expected unqualified-id before ‘for’
  for(int i = 0; i < ntc; i++)
  ^~~
test.cpp:12:17: error: ‘i’ does not name a type
  for(int i = 0; i < ntc; i++)
             ^
test.cpp:12:26: error: ‘i’ does not name a type
  for(int i = 0; i < ntc; i++)

【问题讨论】:

标签: c++ arrays class dynamic


【解决方案1】:

您需要在构造函数中进行类初始化,并在析构函数中进行清理。

class myp
{
  int m_numColumns;
  int m_numRows;
  double** y;
public:

  // overload array operators
  double* operator [] (size_t row) { return y[row]; }
  const double* operator [] (size_t row) const { return y[row]; }

  // return dimensions of array
  int numColumns() const { return m_numColumns; }
  int numRows() const { return m_numRows; }

  // constructor
  myp(int nc, int nr) : m_numColumns(nc), m_numRows(nr)
  {
    y = new double*[m_numRows];

    for(int i = 0; i < m_numColumns; ++i)
      y[i] = new int[m_numColumns];
  }

  // destructor
  ~myp()
  {
    for(int i = 0; i < m_numColumns; ++i)
      delete [] y[i];
    delete [] y;
  }

  // be careful of the copy ctor. I'm deleting it in this case!
  myp(const myp&) = delete;

  // edit: as per user4581301's suggestion
  myp() = delete;
  myp(myp&&) = delete; // remove move ctor
  myp& operator = (const myp&) = delete; // remove assignment
  myp& operator = (myp&&) = delete; // remove move assignment
};

int main()
{
   myp mp(5, 3);
   mp[1][1] = 3;
   cout << mp[1][1]<<endl;
   return 0;
}

【讨论】:

  • 如果需要,可以省略删除移动构造函数和移动赋值运算符。如果提供了用户定义的复制构造函数,则不会创建隐式移动构造函数或移动赋值。删除复制构造函数算作提供。
  • 是的,但是对于 OP 来说,如果他们想构建一个完整的 2D 动态数组类型,最好意识到可能还有更多方法可以实现。
  • 同意。这对我来说意义不大,fortunately Scott Meyers' opinion carries some hefty weight. 旁注:这种类型的矩阵的另一点讨厌之处是它允许像delete[] myMatrix[x];myMatrix[x] = nullptr; 这样的自毁行为。由于指针追逐和与小矩阵一起使用时产生的不良缓存行为。
【解决方案2】:

只是为了跑步。

class myp 
{
    int ntc = 5;
public:
    double **y;

    void initArray()
    {   
        y = new double*[ntc];
        for(int i = 0; i < ntc; ++i)
            y[i] = new double[3]; // i change this line [new int] to [new double]tv
    }   
};

int main()
{
    int x;
    myp mp; 
    mp.initArray();
    mp.y[1][1] = 3;
    cout<<mp.y[1][1]<<endl;;
    return 0;
}

使用构造函数和析构函数

class myp 
{   
    int ntc = 5;
public:  
    double **y;

    myp() // run at created
    {
        y = new double*[ntc];   
        for(int i = 0; i < ntc; ++i)
            y[i] = new double[3];
    }

    ~myp() // run at the end of life cycle 
    {   
        /* free memory here */
    }

};

int main()  
{  
    int x;  
    myp mp;  // myp() called
    mp.y[1][1] = 3;  
    cout<<mp.y[1][1]<<endl;  
    return 0;  
}  

使用带参数的构造函数,用于动态大小

class myp 
{   
    //    int ntc = 5;  // using at created
public:  
    double **y;

    myp(int ntc, int size) // run at created
    // if you want to use only myp mp;
    // myp(int ntc = 5, int size = 3) {} will be helpful
    {
        y = new double*[ntc];   
        for(int i = 0; i < ntc; ++i)
            y[i] = new double[size];
    }

    ~myp() // run at the end of life cycle 
    {   
        /* free memory here */
    }

};

int main()  
{  
    int x;  
    myp mp(5, 3);  // myp(int, int) called
    mp.y[1][1] = 3;  
    cout<<mp.y[1][1]<<endl;  
    return 0;  
}  

【讨论】:

  • 第一个提供的选项是一个坏主意。它不会破坏并允许创建一个定时炸弹对​​象。请尽可能宣传RAII-based solutions。此外,人类有一个令人讨厌的习惯,即锁定他们给出的第一个选项。如果第一个选项很糟糕,那么他们很可能会编写糟糕的代码。第二个选项忽略Rules of Three and Five,通常会导致另一个定时炸弹。
  • 同上第三个选项。最后,答案并没有说明哪里出了问题。
猜你喜欢
  • 2011-01-03
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-07
相关资源
最近更新 更多