Страниц: 1 2 [3]
  Печать  
Автор Тема: класс string из C++  (Прочитано 24806 раз)
int19h
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #30 : Мая 27, 2002, 11:27:00 pm »


Теперь по поводу вашего класса строк (как я его понимаю, исходя из многократных ваших упоминаний). А точнее, по поводу приводимости вашего String к char*.
Мне это напоминает сам C++, а именно: ввести жесткий контроль типов на уровне классов при сохранении полной совместимости с С и думать, что язык стал безопаснее, чем С. Интересно, как будет работать весь ваш контроль после применения стандартных сишных функций, изменяющих содержимое (а значит и, возможно, длину) вашей строки - например, strcpy(...) или scanf("%s"...) ? Неужели вы всерьез считаете, что при этом ваш String более надежен, чем простой char* ?


Кому нужен strcpy при работе с такой строкой? А scanf можно написать и самому, пример тому - CString::Format() из MFC.

Для всего остального - имхо лучше не делать оператор неконстантного преобразования в char*, а вместо этого - функцию, т.е. требовать
явный запрос на опасное преобразование. Или, еще лучше, как в
том же CString:

 char* CString::GetBuffer(int nMinBufLength);
 void  CString::ReleaseBuffer(int nNewLength = -1);

Кстати, std::string::cstr() тоже неплох.

Записан
Evgeniy
Jr. Member
**
Offline Offline

Сообщений: 73


Просмотр профиля
« Ответ #31 : Мая 28, 2002, 02:32:00 am »


int19h пишет:

... А точнее, по поводу приводимости вашего String к char*.
Мне это напоминает сам C++, а именно: ввести жесткий контроль типов на уровне классов при сохранении полной совместимости с С и думать, что язык стал безопаснее, чем С. Интересно, как будет работать весь ваш контроль после применения стандартных сишных функций, изменяющих содержимое (а значит и, возможно, длину) вашей строки - например, strcpy(...) или scanf("%s"...) ? Неужели вы всерьез считаете, что при этом ваш String более надежен, чем простой char* ?


Кому нужен strcpy при работе с такой строкой? А scanf можно написать и самому, пример тому - CString::Format() из MFC.


Угу, а заодно и все остальные функции, использующие char*
Только тогда уже не надо будет и преобразования к char*
Вот только сам char* при этом никуда не денется, а надежность, как и прежде, определяется самым ненадежным звеном


Для всего остального - имхо лучше не делать оператор неконстантного преобразования в char*, а вместо этого - функцию, т.е. требовать
явный запрос на опасное преобразование. Или, еще лучше, как в
том же CString:

 char* CString::GetBuffer(int nMinBufLength);
 void  CString::ReleaseBuffer(int nNewLength = -1);

Кстати, std::string::cstr() тоже неплох.




И кто-нибудь обязательно воспользуется этим GetBuffer() в каком-нибудь scanf() - "Если на стене висит ружье, то оно...."

Извините int19h, но я говорю совсем о другом - C++ как наследник С не является языком высокого уровня. По существу это макроассемблер, и относиться к нему надо соответственно - т.е. с предельной осторожностью.
И уж лучше не декорировать "волчьи ямы", снижая уровень бдительности
Записан
olej
QOR.Team
****
Offline Offline

Сообщений: 42



Просмотр профиля
« Ответ #32 : Мая 28, 2002, 02:40:00 pm »


Evgeniy пишет:
Извините int19h, но я говорю совсем о другом - C++ как наследник С не является языком высокого уровня. По существу это макроассемблер, и относиться к нему надо соответственно - т.е. с предельной осторожностью.
И уж лучше не декорировать "волчьи ямы", снижая уровень бдительности

Evgeniy, вы правы в том смысле, что "лучше быть богатым и здоровым, чем бедным и больным". Конечно, семантические устои Algol-68 хороши, а мне вот очень нравится Ada, а ещё Modula-2 & Oberon. Но ... нам ещё долго жить в C++ (хоть в ++, и туда только потихоньку сползаем из C).

Мне кажется не нужно быть столь категоричным, и, если у нас уж такой инструмент, то и поддекорировать "волчьи ямы" - они после этого станут на порядок реже встречаться.

int19h пишет:
Кому нужен strcpy при работе с такой строкой? А scanf можно написать и самому, пример тому - CString::Format() из MFC.

int19h написал ровно то, что я хотел написать, да лень было ... погоды знаете ли стоят ... весна . Из str* операций только небольшое число действительно опасных: strcpy, strcat, scanf, strdup (по-своему)... Конечно strcpy - опасна при преобразовании к char*, но если у меня есть операция "=" для String, то зачем мне strcpy - не используй. Точно также - конечно strcat опасна (как-то получается что наибольшее число ошибок возникает именно на ней), но вместо неё я могу ввести операции "+" & "+=". Т.е. и происходит подмена опасных операций менее опасными.

Или, еще лучше, как в том же CString:

Вот опыт использования многими моими знакомыми CString показывает - он конечно и "гыдкый" класс, но работа с ним порождает в разы меньшую "плотность" ошибок, а самое главное - темп разработки - выше.

И кто-нибудь обязательно воспользуется этим GetBuffer() в каком-нибудь scanf() - "Если на стене висит ружье, то оно...."

Дак конечно кто-нибудь где-нибудь обязательно использует! Только намного реже это будет происходить, вот и всё.
Записан
int19h
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #33 : Июня 01, 2002, 09:41:00 pm »


И кто-нибудь обязательно воспользуется этим GetBuffer() в каком-нибудь scanf() - "Если на стене висит ружье, то оно...."


Так воспользуется или нет? =) Собственно, пользоваться-то и надо...

А вообще для избежания таких вот вещей перегружаются операторы << и >> для работы с потоками. И никаких scanf'ов. Вообще, классы (и все, что ассоциируется с ними в C++ - перегрузка операторов, преобразования и и.п.) плохо совместимы с vararg-функциями, по понятным причинам. Так что лучше юзать PhCxx и спать спокойно. =)
Записан
int19h
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #34 : Июня 01, 2002, 10:07:00 pm »


Pkun пишет:
А можно как-нибудь читать c помощью getline в stringstream, а не в string?


Эээ... а зачем, собственно?

 ostringstream str;
 string s;
 getline(file, s);
 str << s;


Или можно обратиться напрямую к строке, к которой привязан поток? Имеется в виду на запись, а не str(), который только отдает копию строки, записанной в stringstream.

Нет. Опять же, зачем? Все равно любое издевательство над строкой можно повернуть через функции и операторы stringstream, напрямую либо через строковую temporary-переменную (как вот в этом случае с getline()).
Записан
Pkun
Участник
*
Offline Offline

Сообщений: 1


Просмотр профиля
« Ответ #35 : Июня 04, 2002, 12:31:00 am »


int19h пишет:
Нет. Опять же, зачем? Все равно любое издевательство над строкой можно повернуть через функции и операторы stringstream, напрямую либо через строковую temporary-переменную (как вот в этом случае с getline()).


Видимо не любое.
Может не совсем в тему... но вот со stringstream у меня не прошла одна вещь. Проблема описана в http://qnx.org.ru/forum/viewtopic.php?topic=231&forum=10&0
А почему - непонятно
Записан
Страниц: 1 2 [3]
  Печать  
 
Перейти в: