Re[8]: ок
От: Vi2 Удмуртия http://www.adem.ru
Дата: 19.07.02 12:59
Оценка:
Здравствуйте Al-Ko, Вы писали:

AK>для BYTE* не будут, будут для TYPE*


А ну да, смутили БОЛЬШИЕ буквы и наложились друг на друга TYPE и BYTE. Исходя из этого, может лучше использовать довольно ясную конструкцию, говорящую о том, что ты освобождаешь ПРОСТО указатель, упрощая исходный может быть сложный указатель? Которая не приведёт к непоняткам при беглом взгляде на оператор.
    delete (void*) m_pData;

Но дело твоё, так тоже работать будет. Тут ты прав.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[8]: Кому не лень ковыряться в чужом коде
От: Idler Россия  
Дата: 20.07.02 09:15
Оценка:
Здравствуйте SergH:

Еще вопрос, если не надоел.

template <class T> class IList{
    public:
    int Length;
    T *Items;            //Указатель на сам массив

    IList();
    ~IList();
    IList& operator = (const IList&);
    T operator [](int);
    void Add(const T&);        //Добавить элемент к массиву
    void Add();            //Добавить пустой элемент к массиву
    void Del(int);            //Удалить элемент из массива
    void Clear();            //Отчискта массива
    private:
    };
template <class T> T IList<T>::operator [](int i){
    return Items[i];
    }


Ilist<IList <int> > a;
a.Items[i].Items[i] — работает хорошо
a[i][i] — работает очень плохо
где ошибка?
Re[9]: Кому не лень ковыряться в чужом коде
От: m.a.g. Мальта http://dottedmag.net/
Дата: 20.07.02 10:32
Оценка:
Здравствуйте Idler, Вы писали:

I>Здравствуйте SergH:


I>Еще вопрос, если не надоел.


I>
I>template <class T> class IList{
I>    public:
I>    T *Items;            //Указатель на сам массив
I>    T operator [](int);
I>    };
I>


I>Ilist<IList <int> > a;

I>a.Items[i].Items[i] — работает хорошо
I>a[i][i] — работает очень плохо
I>где ошибка?


В типе возвращаемого значения: при вызове operator[] возвращаемое значение скопируется. Более правильный прототип таков:

template<class T>
const T& IList::operator [](int) const;

template<class T>
T& IList::operator [](int);

кстати, лучше его еще и перегрузить для константных и неконстантных объектов.
Re[10]: Кому не лень ковыряться в чужом коде
От: Idler Россия  
Дата: 20.07.02 12:34
Оценка:
Здравствуйте m.a.g.
Что такое "перегрузить для константных и неконстантных объектов".
Re[11]: Кому не лень ковыряться в чужом коде
От: SergH Россия  
Дата: 20.07.02 16:04
Оценка:
Здравствуйте Idler, Вы писали:

I>Здравствуйте m.a.g.

I>Что такое "перегрузить для константных и неконстантных объектов".

Он уже написал это в своём сообщении

template<class T> 
const T& IList::operator [](int) const; 

template<class T> 
T& IList::operator [](int);


Первый оператор можно вызывать для константных объектов, второй нельзя. Без определения первого оператора такой код не скомпилится:

void function(const IList<int>& list)
{
    int a = list[22]; // ошибка - вызов неконстантного оператора для константного объекта
}


А если у тебя определены оба оператора, всё будет хорошо.
Делай что должно, и будь что будет
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.