我目前正在进行游戏编程模块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;
}
答案 0 :(得分:1)
在复制构造函数中,您必须:
将mSize
的值设置为与创建副本的对象相同。
确保为对象的mData
成员分配内存。
从创建副本的对象中复制数组的每个元素。
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个数组存在。并且在不超出范围之前不释放指针会导致内存泄漏。
如果您只想复制对象,则只需删除复制构造函数(您的第三个构造函数)即可进行浅表复制,它将自动为您完成。