使用 memcpy 进行复制构造函数和二维数组的赋值运算符

问题描述 投票:0回答:1

我有两节课。 指向固定宽度数组的指针和指向用于实现二维浮点数数组的指针。
我想了解是否以及如何使用 memcpy 进行复制构造函数和赋值运算符重载。

class UsingPtrToArr {
  public:
    UsingPtrToArr() {
      m_rows = 1;
      f = new float[m_rows][8];
      for (int i = 0; i < 8; ++i)
      {
        f[0][i] = i+1;
      }
    }
    UsingPtrToArr(const UsingPtrToArr& iv) {
      m_rows = iv.m_rows;
      f = new float[m_rows][8];
      for(int r = 0; r < m_rows; ++r) {
        for (int i = 0; i < 8; ++i)
          f[r][i] = iv.f[r][i];
      }
      sum = iv.sum;
    }
    UsingPtrToArr& operator= (const UsingPtrToArr& iv) {
      m_rows = iv.m_rows;
      f = new float[m_rows][8];
      for(int r = 0; r < m_rows; ++r) {
        for (int i = 0; i < 8; ++i)
          f[r][i] = iv.f[r][i];
      }
      sum = iv.sum;
      return *this;
    }
    void sumArray() {
      for(int r = 0; r < m_rows; ++r) {
        for (int i = 0; i < 8; ++i)
          sum += f[r][i];
      }
    }

    ~UsingPtrToArr() {
      delete[] f;
    }
  private:
    float (*f)[8];
    double sum = 0;
    int m_rows;
};

又一堂课

class UsingPtrToPtr {
  public:
    UsingPtrToPtr() {
      int row = 1;
      int col = 8;
      m_rows = row;
      m_cols = col;
      f = new float*[row];
      for(int i = 0; i < row; ++i) {
        f[i] = new float[col];
      }
      for (int i = 1; i < row; ++i)
      {
        for (int j = 0; j < col; ++j) {
          f[i][j] = j+1;
        }
      }
    }
    UsingPtrToPtr(const UsingPtrToPtr& iv) {
      sum = iv.sum;
      m_rows = iv.m_rows;
      m_cols = iv.m_cols;
      f = new float*[m_rows];
      for(int i = 0; i < m_rows; ++i) {
        f[i] = new float[m_cols];
      }
      for (int i = 1; i < m_rows; ++i)
      {
        for (int j = 0; j < m_cols; ++j) {
          f[i][j] = iv.f[i][j];
        }
      }
      sum = iv.sum;
    }
    UsingPtrToPtr& operator= (const UsingPtrToPtr& iv) {
      m_rows = iv.m_rows;
      m_cols = iv.m_cols;
      f = new float*[m_rows];
      for(int i = 0; i < m_rows; ++i) {
        f[i] = new float[m_cols];
      }
      for (int i = 1; i < m_rows; ++i)
      {
        std::memcpy(f[i], iv.f[i], sizeof(float) * m_cols);
        for (int j = 0; j < m_cols; ++j) {
          f[i][j] = iv.f[i][j];
        }
      }
      sum = iv.sum;
      return *this;
    }
    void sumArray() {
      for (int i = 1; i < m_rows; ++i)
      {
        for (int j = 0; j < m_cols; ++j) {
          sum += f[i][j];
        }
      }
    }
    ~UsingPtrToPtr() {
      for (int i = 1; i < m_rows; ++i)
      {
        delete[] f[i];
      }
      delete[] f;
    }
  private:
    float **f;
    int m_rows;
    int m_cols;
    double sum = 0;
};

免责声明:这是出于我的理解目的。我知道,我可以在 C++ 中使用

std::vector

c++ copy-constructor memcpy assignment-operator
1个回答
0
投票

下面的代码似乎可以工作

UsingPtrToArr(const UsingPtrToArr& iv) {
      m_rows = iv.m_rows;
      f = new float[m_rows][8];
      std::memcpy(f, iv.f, sizeof(float)*m_rows*8);
      sum = iv.sum;
}

对于UsingPtrToPtr,我使用了下面的代码

    UsingPtrToPtr(const UsingPtrToPtr& iv) {
          sum = iv.sum;
          m_rows = iv.m_rows;
          m_cols = iv.m_cols;
          f = new float*[m_rows];
          for(int i = 0; i < m_rows; ++i) {
            f[i] = new float[m_cols];
          }
          for (int i = 0; i < m_rows; ++i)
          {
            std::memcpy(f[i], iv.f[i], sizeof(float)*m_cols);
          }
          sum = iv.sum;
}
© www.soinside.com 2019 - 2024. All rights reserved.