创建零宽度和零高度的数组?

时间:2009-09-20 19:57:23

标签: c++ arrays class constructor

我的编程课程中有一项任务,非常措辞不好......下面这行真的让我感到困惑。我们正在创建一个名为FloatArray的类,它包含一个数组(arr,它只是指向一堆floats)的指针。

  

默认构造函数FloatArray();应该创建零宽度和零高度的数组。

我不知道我的教授的意思是什么......还有其他人吗?我们需要提供另一个构造函数,它指示数组的高度和宽度。这很好,花花公子 - 只需插入数字,然后分配......但他的意思是“创建零宽度和零高度的数组”?

您知道,数组只是定义为:

float *arr;

帮助我理解这种疯狂!如果由我自己决定,我甚至不会为这样一个班级做一个空白的构造函数......

无论如何 - 我在这里俯瞰什么吗?这是我以前从未遇到的某种术语,还是我说这是疯狂的?

我应该在默认的构造函数中执行以下操作吗?

*arr = 0;

因为我无法做arr = new float[0],现在我可以:P(或者我可以 - 我只是尝试过它(感谢Thomas!)并且它编译并运行......!?

这是否意味着当我arr = new float[0]时,arr指向堆上的某个位置(开头?)?

我知道这个问题似乎很模糊,但这就是整个作业的方式 - 措辞非常差。我只是想确保它不仅仅是我!

5 个答案:

答案 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之外的其他东西 没有制定方法 - 留作练习 我已经提出了一个我所知道的故意错误。