Здравствуйте, SWW, Вы писали:
А>> Плохо выразился. Я имел в виду что-то сделанное на основе char * так, чтобы это было легко применять и в MFC и в ATL и в WTL. А>> Просто мне не совсем понятно, зачем было писать string, если он, в принципе, недоделан до того, чтобы его можно было легко использовать. Иногда он усложняет жизнь, а не упрощает! ...
SWW>Я думаю это объясняется тем, что STL делали ярые юниксоиды, поэтому они по меньшей мере не стремились, а скорее всего специально (из вредности) сделали так, чтобы STL было неудобно применять SWW>в MFC, в ATL и в WTL.
в любой библиотеке, ориентированной на представление строки как char*
Но ни в коей мере не было целью. Философия STL определяется философией развития языка С++:
если в языке уже есть конструкт F и стоит выбор какой новый конструкт добавить A или B, то
если F(A) === B, то одназначно делается выбор в пользу A.
В данном случае: F — явное преобразование типа, А -> c_str(), B -> operator const char*()
В руки программиста дается бОльший контроль за программой, но это требует от него ряда дополнительных действий.
Здравствуйте, SWW, Вы писали:
SWW>Рассуждения замечательные. Я тоже хотел бы видеть стандартную библиотеку как некий полуфабрикат, содержащий минимальный набор функций, которые необходиму всем, а те функции, которые нужны конкретным программистам, они напишут сами. И я поначалу не счел большим неудобством отсутствие operator(const char*) — какие проблемы, сейчас создадим свой класс MyString используя в качестве базового std::string и добавим туда все что мне надо. Но не тут-то было! ВСЕ классы STL не предназначены для использования в качестве базового! Вероятно их авторы считают свои классы истиной в последней инстанции. Подобной самоуверенности даже Микрософт позавидует.
Все бы было не так плохо, если бы в C++ было реализовано наследование конструкторов.
Никто не знает предисторию, почему это не было реализовано?
V> А оно и не заточено вовсе под работу с GetWindowText() или ещё подобным чем-то. Оно вообще-то, и не знает о существовании WindowsAPI.
Ну так об этом-то и говорят! Или тот факт, что оно не заточено под работу с GetWindowText() является оправданием и тем самым доказывает что его нужно использовать для работы с GetWindowText()?
Ты считаешь, что если бы в std::string был operator(const char*) то я бы без труда понял, что означает твой идентификатор SomeString? Не улавливаю связи...
Здравствуйте, SWW, Вы писали:
D>>Все бы было не так плохо, если бы в C++ было реализовано наследование конструкторов.
SWW>А также деструкторы всегда должны быть виртуальными.
Ну если говорить об переопределении поведения класса через наследование, то в STL все плохо:
ни тебе виртуальных деструкторов, ни вообще никаких виртуальных методов. Все методы или public, или private.
И даже если что-нибудь попадется protected, так это часть реализации не регламентированная в стандарте.
Единственное, что можно сделать через наследование — добавить некую функциональность. Но когда видишь десяток конструкторов — все жедание сразу пропадает...
А> Помогите, пожалуйста, начинающему разобраться
А> Что-то я не пойму до конца всю прелесть типа string. А> Как мне получить доступ к самомоу буферу? Ведь c_str() возвращает константу :\ А> Например, как мне использовать тип string для получения текста окна?
А> string s(""); А> GetWindowText(...???...);
а так не поможет
s.resize(1000,' ');
GetWindowText(S.c_str(),s.length());
Здравствуйте, deviv, Вы писали:
D>2) Опять же, почему я обязан давать описание описание того же исключения как ACSII строку? Почему я не могу вернуть описание исключения как UNICODE строку?
Потому что есть базовый класс всех исключений — exception, который хочет именно ASCII строку.
Но, если так хочется передавать UNICODE строки средствами стандартных классов исключений — перекодируй из в UTF-8
Реально же, исключения вообще не должны содержавть какой-либо текст. В них нужно хранить: Код (идентификатор) ошибки, по которому можно найти шаблон сообщения
Параметры для формирования сообщения
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, deviv, Вы писали:
D>>2) Опять же, почему я обязан давать описание описание того же исключения как ACSII строку? Почему я не могу вернуть описание исключения как UNICODE строку?
КД>Потому что есть базовый класс всех исключений — exception, который хочет именно ASCII строку.
А почему он хочет именно ASCII? Причина? Чем ASCII лучше другого представления строк?
КД>Но, если так хочется передавать UNICODE строки средствами стандартных классов исключений — перекодируй из в UTF-8
А хочу гибкости. А раз ее меня лишают, то пытаюсь понять ради чего?
КД>Реально же, исключения вообще не должны содержавть какой-либо текст. В них нужно хранить: КД> КД>Код (идентификатор) ошибки, по которому можно найти шаблон сообщения КД>Параметры для формирования сообщения КД>
Тогда для чего там метод what()? Чтобы по коду найти сообщение об ошибке, подставить в него параметры?
Затем перекодировать в UTF-8 (например), вернуть const char* наружу, что его там же снова перекодировали в UNICODE и записали в лог или отобразили на экран?
Здравствуйте, voxel3d, Вы писали:
V> У тебя со временем что-то не сходится.. То три месяца назад, то через год...
На самом деле эта история началась 3 года назад и продолжается до сих пор (окончатель запутал со временем ?
V> Вывод: со стандартной библиотекой если нормально всё выучить, можно работать вполне нормально, а недоучившись, оно, конечно, через это самое место. Недоучившись, потом и задаются дурацкие вопросы -- а нахрен надо было такие строки писать??
А что кому-то удавалось "нормально ВСЕ выучить"? Потом, я не понял в чем претензия: в вопросе топика? (нормальный вопрос, хотя это и не мое дело) или в моем ответе? (рассказал про себя, поскольку был в свое время также неприятно удивлен этой особенностью стандартного string)
V> А оно и не заточено вовсе под работу с GetWindowText() или ещё подобным чем-то. Оно вообще-то, и не знает о существовании WindowsAPI.
Т.е. если прога под Win32, то лучше о нем забыть...
Здравствуйте, deviv, Вы писали:
D>Тогда для чего там метод what()? Чтобы по коду найти сообщение об ошибке, подставить в него параметры?
Вот ты вбил себе в голову, что пользователю нужно отобразить именно то, что возращает what и теперь мечешься — а как мне вывести юзеру что-то другое. Исходя из своео небольшого опыта — стандарные исключения должны использоваться только для перехвата нештатных ситуаций. Ну типа нехватка памяти, выход за пределы диапазона и т.д.
На прикладном уровне нужно генерировать свои классы исключений, производные от exception.
Ты перехватываешь все исключения
catch(exception&)
а потом через dynamic_cast анализируешь, что и именно ты поймал и как его нужно обработать.
Обрати внимание на реализацию OLEDB_ProcessErrorException. Если она не смогла понять что это за исключение, то только тогда она лезет к exception::what()
понятно, что это не предназначено для написания маленьких программ. Но в больших программах, думается, всё именно так и делается.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, deviv, Вы писали:
D>Здравствуйте, icWasya, Вы писали:
W>>Здравствуйте, Аноним, Вы писали:
А>>> string s(""); А>>> GetWindowText(...???...);
W>>а так не поможет W>> s.resize(1000,' '); W>> GetWindowText(S.c_str(),s.length());
D>Чтобы это откомпилировалось нужен const_cast. D>Ну а чтобы это всегда стабильно работало — извините, не получится....
ну тогда так
string s;
S.resize(GetWindowTextLength(Memo1->Handle),' ');
GetWindowText(Memo1->Handle,(char*)S.c_str(),S.length());
>> ......чтобы это всегда стабильно ......
и в чём тут проблема? — если только неправильно учитывать размер буфера — так ведь ничего не поможет
Здравствуйте, icWasya, Вы писали:
W> и в чём тут проблема? — если только неправильно учитывать размер буфера — так ведь ничего не поможет
Проблема в том, что c_str() не обязан возвращать непосредственно буфер. Это остается в компетенции разработчика библиотеки.
Точко также, факт того, что c_str() возвращает ZERO-terminated строку не обязывает хранить представление строки именно в этом формате.