如何在构造函数中将一个数组分配给另一个数组?

时间:2019-03-14 05:51:58

标签: c++

我目前正在进行游戏编程模块1/2 pdf中第7章的第二次练习。我完全不知道如何实现两个功能。这两个函数是:第三个构造函数(从另一个数组创建一个数组),然后重载=运算符。

我试图为两者写一些东西,但都失败了。我相信我已经实现了其他所有功能(因为练习是从类蓝图实现功能),而且我不确定如何去实现这两个功能。救命?如果您给我解决方案,请解释为什么是解决方案。

class FloatArray {
    public:

        //Creates a float array with 0 elements
        FloatArray();

    //Creates a float array with 'size' elements
    FloatArray(int size);

    //Create a float array from another float array. Avoid memory leaks
    FloatArray(const FloatArray & rhs);

    //Frees up dynamic memory
    ~FloatArray();

    //Defines how a float array shall be assigned to another float array. No memory leaks
    FloatArray & operator = (const FloatArray & rhs);

    //Resize a float array to another size
    void resize(int newSize);

    //Returns the number of elements in an array
    int size();

    //Allow client to access the elements of FloatArray objects
    float & operator[](int i);

    private:
        float * mData; //Pointer to an array of floats (dynamic memory)
    int mSize; //The number of elements in an array
};

FloatArray::FloatArray() {
    mData = new float[0];
}

FloatArray::FloatArray(int size) {
    mData = new float[size];
}

FloatArray::FloatArray(const FloatArray & rhs) {
    const FloatArray * mData = & rhs;
}

FloatArray::~FloatArray() {
    delete[] mData;
}

FloatArray & FloatArray::operator = (const FloatArray & rhs) {

}

void FloatArray::resize(int newSize) {
    mSize = newSize;
}

int FloatArray::size() {
    return mSize;
}

float & FloatArray::operator[](int i) {
    return mData[i];
}

void PrintFloatArray(FloatArray & fa) {
    std::cout << "{ ";
    for (int i = 0; i < fa.size(); ++i)
        std::cout << fa[i] << " ";
    std::cout << "}" << endl << endl;
}

int main() {
    FloatArray A;

    A.resize(4);
    A[0] = 1.0 f;
    A[1] = 2.0 f;
    A[2] = 3.0 f;
    A[3] = 4.0 f;

    std::cout << "Printing A. . .";
    PrintFloatArray(A);

    FloatArray B(A);

    std::cout << "Printing B. . .";
    PrintFloatArray(B);

    /* FloatArray C = A;

    std::cout << "Printing C. . ." ;
    PrintFloatArray(C);

    A = A = A = A;

    std::cout << "Printing A. . ." ;
    PrintFloatArray(A);*/

    return 0;
}

2 个答案:

答案 0 :(得分:1)

在复制构造函数中,您必须:

  1. mSize的值设置为与创建副本的对象相同。

  2. 确保为对象的mData成员分配内存。

  3. 从创建副本的对象中复制数组的每个元素。

FloatArray::FloatArray(const FloatArray &rhs) : mSize(rhs.mSize)
{
   mData = = new float[mSize];
   for ( int i = 0; i < mSize; ++i )
   {
      mData[i] = rhs.mData[i[;
   }
}

对于赋值运算符,最好使用copy-and-swap idiom

答案 1 :(得分:0)

  

第三个构造函数(从另一个数组创建一个数组)

您的构造函数不会从另一个数组创建数组,它只是创建一个指向您传递的FloatArray的本地指针,此时,仍然只有1个数组存在。并且在不超出范围之前不释放指针会导致内存泄漏。

如果您只想复制对象,则只需删除复制构造函数(您的第三个构造函数)即可进行浅表复制,它将自动为您完成。