我的编程课程中有一项任务,非常措辞不好......下面这行真的让我感到困惑。我们正在创建一个名为FloatArray的类,它包含一个数组(arr
,它只是指向一堆floats
)的指针。
默认构造函数FloatArray();应该创建零宽度和零高度的数组。
我不知道我的教授的意思是什么......还有其他人吗?我们需要提供另一个构造函数,它指示数组的高度和宽度。这很好,花花公子 - 只需插入数字,然后分配......但他的意思是“创建零宽度和零高度的数组”?
您知道,数组只是定义为:
float *arr;
帮助我理解这种疯狂!如果由我自己决定,我甚至不会为这样一个班级做一个空白的构造函数......
无论如何 - 我在这里俯瞰什么吗?这是我以前从未遇到的某种术语,还是我说这是疯狂的?
我应该在默认的构造函数中执行以下操作吗?
*arr = 0;
因为我无法做arr = new float[0]
,现在我可以:P(或者我可以 - 我只是尝试过它(感谢Thomas!)并且它编译并运行......!?)
这是否意味着当我arr = new float[0]
时,arr
指向堆上的某个位置(开头?)?
我知道这个问题似乎很模糊,但这就是整个作业的方式 - 措辞非常差。我只是想确保它不仅仅是我!
答案 0 :(得分:6)
此练习可能旨在突出显示界面和表示之间的区别。我不知道FloatArray
类中的其他方法应该是什么,但我怀疑有一些方法可以在数组的特定位置获取和设置元素。
使用这样的默认构造函数,该类应该创建一个动作的对象,就像它具有零宽度和零高度一样。也就是说,如果调用者然后请求设置数组的特定元素,那么该方法应该返回它通常用于“越界”的任何条件。也就是说,通过抛出异常或错误返回等等。
在内部,类可以通过分配内存来表示它喜欢的条件,甚至。也许设置arr = NULL
就足够了,或者它必须指向非空的内存,但这取决于你作为类的实现者。关键是接口应该按照分配问题的定义以特定的方式行事。
答案 1 :(得分:4)
我认为他的意思是构造函数不应该为数组初始化任何内存空间。
然而问你的教授。
答案 2 :(得分:2)
在构造函数中执行*arr = 0
会非常不明智。由于arr
未初始化,因此可能指向任何内容。因此*arr = 0
表示“将一些随机存储块设置为0,这可能会失败。另一方面,arr = new float[0]
正在indeed a valid operation。
我建议对0大小的数组使用“new float [0]”。这减少了对0大小数组的一些特殊处理,例如使用new FloatArray(0)
显式创建的数组,这应该导致与new FloatArray()
完全相同的数组。请注意,一个好的替代方法可能是在“常规”构造函数中使用length参数的默认零值。
答案 3 :(得分:1)
你应该问你的教授。我怀疑他会在这里看到这个。他可能只是想把它初始化为null。
答案 4 :(得分:0)
你可能想要这样的东西:
#include <exception>
class FloatArray
{
public:
FloatArray():arr(new float[0]){}
FloatArray(int width, int height)
{
arr=new float[height*width];
mWidth=width;
mHeight=height;
}
~FloatArray(){ delete [] arr; }
float operator()(int xindex, int yindex)
{
if (!isValid(xindex,yindex))
{
throw std::exception(); // Some suitable exception
}
return arr[yindex*mWidth+xindex];
}
bool isValid(int xindex, int yindex);
private:
float* arr;
int mWidth;
int mHeight;
};
注意事项:
我已经离开isValid()
而没有作为练习的定义
对于 EDIT: delete [] arr;
,无论哪个ctor被调用,dtor都可以。
我使用operator()
作为访问者
你可以抛出除std :: exception之外的其他东西
没有制定方法 - 留作练习
我已经提出了一个我所知道的故意错误。