вектор и границы
От: Tom Россия http://www.RSDN.ru
Дата: 29.09.05 10:00
Оценка: +1 :))
Вот сижу делаю ревью чужого кода:

template <class Item>
class SafeVector : public std::vector<Item>
{
    static Item m_FakeItem;
public:
    std::vector<Item>::const_reference operator[](
        std::vector<Item>::size_type Index) const
    {
        if (Index < 0 || Index >= size())
            return m_FakeItem;
        return (*(begin() + Index));
    }
    std::vector<Item>::reference operator[](
        std::vector<Item>::size_type Index)
    {
        if (Index < 0 || Index >= size())
            return m_FakeItem;
        return (*(begin() + Index));
    }
};


Как вам такое? Я вот думаю как бы помягче обьяснить человеку, что он не прав.
Народная мудрось
всем все никому ничего(с).
Re: вектор и границы
От: rus blood Россия  
Дата: 29.09.05 10:04
Оценка: +1
Здравствуйте, Tom, Вы писали:

Tom>Как вам такое? Я вот думаю как бы помягче обьяснить человеку, что он не прав.


Без контекста использования нельзя сказать, прав он или нет.
Может требуется такая логика работы, извращенная...
Имею скафандр — готов путешествовать!
Re: вектор и границы
От: srggal Украина  
Дата: 29.09.05 10:05
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>Вот сижу делаю ревью чужого кода:


Tom>Я вот думаю как бы помягче обьяснить человеку, что он не прав.


Обяснить, что есть

vector::at()


только и всего, невооруженным газом видно, что велосипедист хотел сделать как лучше

Впрочем как и все представители этого вида спорта
... << RSDN@Home 1.1.4 stable rev. 510>>
Re: вектор и границы
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 29.09.05 10:07
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>Как вам такое? Я вот думаю как бы помягче обьяснить человеку, что он не прав.


А с каких пор разрешено наследоваться от std::vector? Уж пусть пишет контейнерный адаптер тогда. Как std::stack, например.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
HgLab: Mercurial Server and Repository Management for Windows
Re: вектор и границы
От: Glоbus Украина  
Дата: 29.09.05 10:08
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>Вот сижу делаю ревью чужого кода:


Tom>
Tom>template <class Item>
Tom>class SafeVector : public std::vector<Item>
Tom>{
Tom>    static Item m_FakeItem;
Tom>public:
Tom>    std::vector<Item>::const_reference operator[](
Tom>        std::vector<Item>::size_type Index) const
Tom>    {
Tom>        if (Index < 0 || Index >= size())
Tom>            return m_FakeItem;
Tom>        return (*(begin() + Index));
Tom>    }
Tom>    std::vector<Item>::reference operator[](
Tom>        std::vector<Item>::size_type Index)
Tom>    {
Tom>        if (Index < 0 || Index >= size())
Tom>            return m_FakeItem;
Tom>        return (*(begin() + Index));
Tom>    }
Tom>};
Tom>


Tom>Как вам такое? Я вот думаю как бы помягче обьяснить человеку, что он не прав.


Да очень просто — получается, что даже если пользователь класса указал недопустимый индекс, он все равно получит вполне валидное значение из вектора. И кому такое надо? Уж лучше бы эксепшин кидал. Далее — еще не хватает второго параметра шаблона — аллокатора для вектора — тоже хорошо бы ввести. Ну и так как operator[] не виртуальный, то при передаче по указателю на базовый класс объекта этого типа код будет неправильно работать.
А вообще — специально для этого есть метод at() — он кидает исключение std::out_of_range().
Удачи тебе, браток!
Re: вектор и границы
От: Глеб Алексеев  
Дата: 29.09.05 10:09
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>Как вам такое? Я вот думаю как бы помягче обьяснить человеку, что он не прав.


Намекнуть на существование метода at?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: вектор и границы
От: Глеб Алексеев  
Дата: 29.09.05 10:14
Оценка: 1 (1) +1
Здравствуйте, Нахлобуч, Вы писали:

Н>А с каких пор разрешено наследоваться от std::vector?

А с каких пор запрещено?
ИМХО, опасность удаления наследника стандартного контейнера через указатель на базовый класс несколько преувеличена, хоть Майерсы с Саттерами любят в нее носом тыкать.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: вектор и границы
От: ssm Россия  
Дата: 29.09.05 10:24
Оценка:
Здравствуйте, Tom, Вы писали:


Tom>Как вам такое? Я вот думаю как бы помягче обьяснить человеку, что он не прав.


ИМХО название "SafeVector" выбрано неудачно для данной концепции. А вообще стоило бы показать как сие используется. Если как повсеместная замена std::vector, то однозначно — зло. А если как вариант Элджеровской хромающей лошадки, то почему бы и нет?
Re[2]: вектор и границы
От: Tom Россия http://www.RSDN.ru
Дата: 29.09.05 10:27
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Здравствуйте, Tom, Вы писали:


Tom>>Как вам такое? Я вот думаю как бы помягче обьяснить человеку, что он не прав.


RB>Без контекста использования нельзя сказать, прав он или нет.

RB>Может требуется такая логика работы, извращенная...

Применяется он вместо вектора, например так:
return m_mCells[nChildID][nLookupID][nCell-1].m_nAchieved;
Народная мудрось
всем все никому ничего(с).
Re[3]: вектор и границы
От: GregZ СССР  
Дата: 29.09.05 10:59
Оценка:
Здравствуйте, Глеб Алексеев, Вы писали:

ГА>Здравствуйте, Нахлобуч, Вы писали:


Н>>А с каких пор разрешено наследоваться от std::vector?

ГА>А с каких пор запрещено?
ГА>ИМХО, опасность удаления наследника стандартного контейнера через указатель на базовый класс несколько преувеличена, хоть Майерсы с Саттерами любят в нее носом тыкать.

Т.е. для вас вполне приемлемо создать собственный контейнер, открыто наследуясь от какого-либо стандартного контейнера?
Re[4]: вектор и границы
От: Анатолий Широков СССР  
Дата: 29.09.05 11:02
Оценка:
GZ>Т.е. для вас вполне приемлемо создать собственный контейнер, открыто наследуясь от какого-либо стандартного контейнера?

Простите, а кто Вам внушил обратное — то есть, что это делать нельзя?
Re[4]: вектор и границы
От: _DAle_ Беларусь  
Дата: 29.09.05 11:08
Оценка:
Здравствуйте, GregZ, Вы писали:

GZ>Здравствуйте, Глеб Алексеев, Вы писали:


ГА>>Здравствуйте, Нахлобуч, Вы писали:


Н>>>А с каких пор разрешено наследоваться от std::vector?

ГА>>А с каких пор запрещено?
ГА>>ИМХО, опасность удаления наследника стандартного контейнера через указатель на базовый класс несколько преувеличена, хоть Майерсы с Саттерами любят в нее носом тыкать.

GZ>Т.е. для вас вполне приемлемо создать собственный контейнер, открыто наследуясь от какого-либо стандартного контейнера?


Вот, например, мнение двухлетней давности Андрея Тарасевича.
http://www.rsdn.ru/Forum/Message.aspx?mid=421616&amp;only=1
Автор: Андрей Тарасевич
Дата: 25.10.03
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[5]: вектор и границы
От: GregZ СССР  
Дата: 29.09.05 11:10
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

GZ>>Т.е. для вас вполне приемлемо создать собственный контейнер, открыто наследуясь от какого-либо стандартного контейнера?


АШ>Простите, а кто Вам внушил обратное — то есть, что это делать нельзя?


По-моему отсутствие виртуального деструктора у стандартных контейнеров говорит об этом достаточно красноречиво.
Re[6]: вектор и границы
От: Анатолий Широков СССР  
Дата: 29.09.05 11:12
Оценка:
GZ>По-моему отсутствие виртуального деструктора у стандартных контейнеров говорит об этом достаточно красноречиво.

А Вы что, будете удалять вектор полиморфно, то есть через базу? Хм.
Re[7]: вектор и границы
От: GregZ СССР  
Дата: 29.09.05 11:14
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

GZ>>По-моему отсутствие виртуального деструктора у стандартных контейнеров говорит об этом достаточно красноречиво.

АШ>А Вы что, будете удалять вектор полиморфно, то есть через базу? Хм.

Я — скорее всего не буду.
Сторонний человек использующий мой контейнер — вполне вероятно.
Re[8]: вектор и границы
От: Анатолий Широков СССР  
Дата: 29.09.05 11:16
Оценка:
GZ>Я — скорее всего не буду.
GZ>Сторонний человек использующий мой контейнер — вполне вероятно.

Но это не повод отказываться от наследования.
Re[9]: вектор и границы
От: GregZ СССР  
Дата: 29.09.05 11:22
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

GZ>>Я — скорее всего не буду.

GZ>>Сторонний человек использующий мой контейнер — вполне вероятно.
АШ>Но это не повод отказываться от наследования.

Интересное мнение. Я конечно не параноик, но предпочитаю перестраховываться.
Может тогда кто объяснит мне почему же нет таки виртуальных деструкторов у стандартных контейнеров?
Re[3]: вектор и границы
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 29.09.05 11:25
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>>>Как вам такое? Я вот думаю как бы помягче обьяснить человеку, что он не прав.


RB>>Без контекста использования нельзя сказать, прав он или нет.

RB>>Может требуется такая логика работы, извращенная...

Tom>Применяется он вместо вектора, например так:

Tom>return m_mCells[nChildID][nLookupID][nCell-1].m_nAchieved;

Вот здесь
Автор: eao197
Дата: 09.06.05
я описывал задачку по решению СЛАУ большой размерности. Так для ее решения я как раз использовал подобный фокус. И он был оправдан тем, что в определенные ячейки матрицы всегда помещались нули. Эти нули получались в результате каких-то хитрых расчетов и никогда затем не использовались. В таких условиях проще было позволить писать в "молоко", чем преобразовывать сложный алгоритм первоначального заполнения матрицы.

Может быть и здесь "попадания в молоко" по алгоритму вполне допустимы?
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[10]: вектор и границы
От: Анатолий Широков СССР  
Дата: 29.09.05 11:31
Оценка:
GZ>Интересное мнение. Я конечно не параноик, но предпочитаю перестраховываться.
GZ>Может тогда кто объяснит мне почему же нет таки виртуальных деструкторов у стандартных контейнеров?

Я далек от мысли, что все стандартные контейнеры вы используете по следующей схеме:


std::vector<int> *ptr = new std::vector<int>(10, 1);
...
(*ptr)[1] = 10;
...
delete ptr;


А все таки предпочитаете более привычную:

std::vector<int> arr(10, 1);
...

и ни о каком удалении не задумываетесь.

Так зачем же вектору виртуальный деструктор?
Re[4]: вектор и границы
От: Tom Россия http://www.RSDN.ru
Дата: 29.09.05 11:42
Оценка:
E>Может быть и здесь "попадания в молоко" по алгоритму вполне допустимы?
Автор кода сказал, что это только для защиты сделано
Народная мудрось
всем все никому ничего(с).
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.