Tom>Как вам такое? Я вот думаю как бы помягче обьяснить человеку, что он не прав.
Да очень просто — получается, что даже если пользователь класса указал недопустимый индекс, он все равно получит вполне валидное значение из вектора. И кому такое надо? Уж лучше бы эксепшин кидал. Далее — еще не хватает второго параметра шаблона — аллокатора для вектора — тоже хорошо бы ввести. Ну и так как operator[] не виртуальный, то при передаче по указателю на базовый класс объекта этого типа код будет неправильно работать.
А вообще — специально для этого есть метод at() — он кидает исключение std::out_of_range().
Здравствуйте, Нахлобуч, Вы писали:
Н>А с каких пор разрешено наследоваться от std::vector?
А с каких пор запрещено?
ИМХО, опасность удаления наследника стандартного контейнера через указатель на базовый класс несколько преувеличена, хоть Майерсы с Саттерами любят в нее носом тыкать.
Tom>Как вам такое? Я вот думаю как бы помягче обьяснить человеку, что он не прав.
ИМХО название "SafeVector" выбрано неудачно для данной концепции. А вообще стоило бы показать как сие используется. Если как повсеместная замена std::vector, то однозначно — зло. А если как вариант Элджеровской хромающей лошадки, то почему бы и нет?
Здравствуйте, rus blood, Вы писали:
RB>Здравствуйте, Tom, Вы писали:
Tom>>Как вам такое? Я вот думаю как бы помягче обьяснить человеку, что он не прав.
RB>Без контекста использования нельзя сказать, прав он или нет. RB>Может требуется такая логика работы, извращенная...
Применяется он вместо вектора, например так:
return m_mCells[nChildID][nLookupID][nCell-1].m_nAchieved;
Здравствуйте, Глеб Алексеев, Вы писали:
ГА>Здравствуйте, Нахлобуч, Вы писали:
Н>>А с каких пор разрешено наследоваться от std::vector? ГА>А с каких пор запрещено? ГА>ИМХО, опасность удаления наследника стандартного контейнера через указатель на базовый класс несколько преувеличена, хоть Майерсы с Саттерами любят в нее носом тыкать.
Т.е. для вас вполне приемлемо создать собственный контейнер, открыто наследуясь от какого-либо стандартного контейнера?
Здравствуйте, GregZ, Вы писали:
GZ>Здравствуйте, Глеб Алексеев, Вы писали:
ГА>>Здравствуйте, Нахлобуч, Вы писали:
Н>>>А с каких пор разрешено наследоваться от std::vector? ГА>>А с каких пор запрещено? ГА>>ИМХО, опасность удаления наследника стандартного контейнера через указатель на базовый класс несколько преувеличена, хоть Майерсы с Саттерами любят в нее носом тыкать.
GZ>Т.е. для вас вполне приемлемо создать собственный контейнер, открыто наследуясь от какого-либо стандартного контейнера?
Здравствуйте, Анатолий Широков, Вы писали:
GZ>>Т.е. для вас вполне приемлемо создать собственный контейнер, открыто наследуясь от какого-либо стандартного контейнера?
АШ>Простите, а кто Вам внушил обратное — то есть, что это делать нельзя?
По-моему отсутствие виртуального деструктора у стандартных контейнеров говорит об этом достаточно красноречиво.
Здравствуйте, Анатолий Широков, Вы писали:
GZ>>По-моему отсутствие виртуального деструктора у стандартных контейнеров говорит об этом достаточно красноречиво. АШ>А Вы что, будете удалять вектор полиморфно, то есть через базу? Хм.
Я — скорее всего не буду.
Сторонний человек использующий мой контейнер — вполне вероятно.
Здравствуйте, Анатолий Широков, Вы писали:
GZ>>Я — скорее всего не буду. GZ>>Сторонний человек использующий мой контейнер — вполне вероятно. АШ>Но это не повод отказываться от наследования.
Интересное мнение. Я конечно не параноик, но предпочитаю перестраховываться.
Может тогда кто объяснит мне почему же нет таки виртуальных деструкторов у стандартных контейнеров?
Здравствуйте, Tom, Вы писали:
Tom>>>Как вам такое? Я вот думаю как бы помягче обьяснить человеку, что он не прав.
RB>>Без контекста использования нельзя сказать, прав он или нет. RB>>Может требуется такая логика работы, извращенная...
Tom>Применяется он вместо вектора, например так: Tom>return m_mCells[nChildID][nLookupID][nCell-1].m_nAchieved;
я описывал задачку по решению СЛАУ большой размерности. Так для ее решения я как раз использовал подобный фокус. И он был оправдан тем, что в определенные ячейки матрицы всегда помещались нули. Эти нули получались в результате каких-то хитрых расчетов и никогда затем не использовались. В таких условиях проще было позволить писать в "молоко", чем преобразовывать сложный алгоритм первоначального заполнения матрицы.
Может быть и здесь "попадания в молоко" по алгоритму вполне допустимы?
... << RSDN@Home 1.1.4 stable rev. 510>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
GZ>Интересное мнение. Я конечно не параноик, но предпочитаю перестраховываться. GZ>Может тогда кто объяснит мне почему же нет таки виртуальных деструкторов у стандартных контейнеров?
Я далек от мысли, что все стандартные контейнеры вы используете по следующей схеме: