代码之家  ›  专栏  ›  技术社区  ›  Breakthrough

创建一个零宽零高的数组?

  •  2
  • Breakthrough  · 技术社区  · 15 年前

    我的编程课有一个作业,就是 非常 措词不当…下面的那句话真让我头疼。我们正在创建一个名为floatArray的类,其中包含一个数组( arr 这只是一个指向 floats )。

    默认的构造函数floatArray();应创建零宽零高的数组。

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

    正如您所知,数组简单地定义为:

    float *arr;
    

    帮助我理解这种疯狂!如果由我来决定,我甚至不会为这样一个类创建一个空白的构造函数…

    不管怎样-我在这里忽略了什么吗?这是我以前从未遇到过的术语,还是我说这是疯狂的正确说法?

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

    *arr = 0;
    

    因为我做不到 arr = new float[0] ,现在我可以:p( 或者我可以-我刚试过(谢谢托马斯!)它编译并运行…??? )

    这是不是意味着当我这样做的时候 arr=新浮动[0] , 阿雷尔 指向某个位置(开始?)在堆上?

    我知道这个问题看起来很含糊,但整个作业就是这样的——措辞很差。我只是想确定不只是我!

    5 回复  |  直到 11 年前
        1
  •  2
  •   larsmoa    15 年前

    *arr = 0 在构造函数中是非常不明智的。自从 arr 未初始化,它可能指向任何内容。为此 *ARR=0 意思是“设置一些可能会失败的随机内存块为0”。另一方面,做 arr = new float[0] indeed a valid operation .

    我建议对0大小的数组使用“new float[0]”。这减少了对0大小数组的一些特殊处理,例如使用 new FloatArray(0) 其结果应与 new FloatArray() . 注意,一个好的选择可能是在“常规”构造函数中使用长度参数的默认零值。

        2
  •  6
  •   Greg Hewgill    15 年前

    这个练习的目的可能是强调 界面 表现 . 我不知道 FloatArray 类应该是,但我怀疑有一些方法可以在数组的特定位置获取和设置元素。

    使用这样的默认构造函数,类应该创建一个 行为 好像它有零宽零高。也就是说,如果调用者随后请求设置数组的某个特定元素,那么该方法应该返回它通常用于“越界”的任何条件。也就是说,通过抛出异常或错误返回等。

    在内部,类可以表示这个条件,不管它喜欢什么, 即使 通过分配内存。也许这就足够了 arr = NULL 或者它必须指向非空内存,但这取决于您作为类的实现者。关键是 界面 应以作业问题所定义的特定方式行事。

        3
  •  4
  •   Cristina    15 年前

    我认为他意味着构造函数不应该为数组初始化任何内存空间。

    尽管如此,还是问问你的教授。

        4
  •  1
  •   jdelator    15 年前

    你应该问问你的教授。我怀疑他会在这里看到这个。他可能只是想将其初始化为空。

        5
  •  0
  •   quamrana    15 年前

    你可能想要这样的东西:

    #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() 没有定义为练习。
    DTOR可以 编辑: delete [] arr; 无论调用哪个ctor。
    我已经用过 operator() 作为存取器。
    除了std::exception,您还可以抛出其他东西。
    没有设定方法-留作练习。
    我故意犯了一个我知道的错误。