Создание массива нулевой ширины и нулевой высоты? - PullRequest
2 голосов
/ 20 сентября 2009

У меня есть задание из моего класса программирования, которое очень плохо сформулировано ... Следующая строка действительно ставит меня в тупик. Мы создаем класс с именем FloatArray, который содержит массив (arr, который является просто указателем на группу floats).

Конструктор по умолчанию FloatArray (); должен создать массив нулевой ширины и нулевой высоты.

Понятия не имею, что под этим подразумевает мой профессор ... Кто-нибудь еще? Мы должны предоставить другой конструктор, который указывает высоту и ширину массива. Это прекрасно и просто - просто вставьте цифры и выделите их ... Но что он имеет в виду под "создать массив нулевой ширины и нулевой высоты"?

Просто, чтобы вы знали, массив просто определяется как:

float *arr;

Помоги мне понять это безумие! Если бы это зависело от меня, я бы даже не сделал пустой конструктор для такого класса ...

Независимо - я что-то пропускаю здесь? Это какая-то терминология, с которой я никогда не сталкивался раньше, или я правильно сказал, что это безумие?

Должен ли я просто сделать следующее в конструкторе по умолчанию?

*arr = 0;

Поскольку я не могу сделать arr = new float[0], теперь я могу: P ( Или, может быть, я могу - я просто попробовал (спасибо Томасу!), И он компилируется и запускается ...!? )

Означает ли это, что когда я делаю arr = new float[0], arr указывает на какое-то место (начало?) В куче?

Я знаю, что этот вопрос кажется довольно расплывчатым, но таково все задание - очень плохо сформулировано. Я просто хочу убедиться, что это не только я!

Ответы [ 5 ]

6 голосов
/ 21 сентября 2009

Это упражнение может быть предназначено для выделения различий между интерфейсом и представлением . Я не знаю, какими должны быть другие методы в классе FloatArray, но я подозреваю, что есть методы для получения и установки элементов в определенных позициях массива.

С таким конструктором по умолчанию класс должен создать объект, который действует , как если бы он имел нулевую ширину и нулевую высоту. То есть, если вызывающая сторона затем запрашивает установить конкретный элемент массива, то метод должен вернуть любое условие, которое обычно было бы для «вне границ». То есть, выбрасывая исключение, или ошибку, или что-то еще.

Внутренне, класс может представлять это условие, как ему нравится, даже , выделяя память. Может быть, достаточно установить arr = NULL, или, возможно, он должен указывать на ненулевую память, но это зависит от вас, как от разработчика класса. Дело в том, что интерфейс должен действовать особым образом, как это определено в вопросе о назначении.

4 голосов
/ 21 сентября 2009

Я думаю, он имеет в виду, что конструктор не должен инициализировать пространство памяти для массива.

Тем не менее спросите своего профессора.

2 голосов
/ 21 сентября 2009

Делать *arr = 0 в конструкторе было бы очень неразумно. Поскольку arr не инициализирован, он может указывать на что угодно. Для этого *arr = 0 означает «установить некоторый случайный блок памяти на 0, который, вероятно, потерпит неудачу. С другой стороны, выполнение arr = new float[0] является действительно действительной операцией .

Я бы рекомендовал использовать "new float [0]" для массивов 0 размера. Это уменьшает некоторую специальную обработку массивов нулевого размера, таких как массивы, явно созданные с использованием new FloatArray(0), что должно привести к тому же массиву, что и new FloatArray(). Обратите внимание, что хорошей альтернативой может быть нулевое значение по умолчанию для аргумента длины в «обычном» конструкторе.

1 голос
/ 20 сентября 2009

Вы должны спросить своего профессора. Я сомневаюсь, что он увидит это здесь. Возможно, он просто хотел инициализировать его нулем.

0 голосов
/ 21 сентября 2009

Возможно, вы захотите что-то вроде этого:

#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() без определения в качестве упражнения.
Дтор в порядке с РЕДАКТИРОВАТЬ: delete [] arr; какой бы ни был вызван ctor.
Я использовал operator() в качестве средства доступа.
Вы можете выбросить что-то еще, кроме std :: exception.
Нет методов установки - оставлено как упражнение.
Я добавил одну преднамеренную ошибку, о которой я знаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...