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

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

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

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

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;
}
c++
2个回答
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


0
投票

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

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

如果你只想复制你的对象,那么只需删除你的复制构造函数(你的第三个构造函数)就可以进行浅层复制,它会自动为你完成。

© www.soinside.com 2019 - 2024. All rights reserved.