Re[6]: string
От: deviv  
Дата: 14.07.03 07:04
Оценка:
Здравствуйте, 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*()

В руки программиста дается бОльший контроль за программой, но это требует от него ряда дополнительных действий.
... << RSDN@Home 1.1 beta 1 >>
WBR,
Влад Волосюк
Re[5]: string
От: deviv  
Дата: 14.07.03 07:07
Оценка:
Здравствуйте, SWW, Вы писали:

SWW>Рассуждения замечательные. Я тоже хотел бы видеть стандартную библиотеку как некий полуфабрикат, содержащий минимальный набор функций, которые необходиму всем, а те функции, которые нужны конкретным программистам, они напишут сами. И я поначалу не счел большим неудобством отсутствие operator(const char*) — какие проблемы, сейчас создадим свой класс MyString используя в качестве базового std::string и добавим туда все что мне надо. Но не тут-то было! ВСЕ классы STL не предназначены для использования в качестве базового! Вероятно их авторы считают свои классы истиной в последней инстанции. Подобной самоуверенности даже Микрософт позавидует.


Все бы было не так плохо, если бы в C++ было реализовано наследование конструкторов.
Никто не знает предисторию, почему это не было реализовано?
... << RSDN@Home 1.1 beta 1 >>
WBR,
Влад Волосюк
Re[3]: string
От: SWW Россия  
Дата: 14.07.03 07:08
Оценка:
V> А оно и не заточено вовсе под работу с GetWindowText() или ещё подобным чем-то. Оно вообще-то, и не знает о существовании WindowsAPI.

Ну так об этом-то и говорят! Или тот факт, что оно не заточено под работу с GetWindowText() является оправданием и тем самым доказывает что его нужно использовать для работы с GetWindowText()?
Re[7]: string
От: SWW Россия  
Дата: 14.07.03 07:13
Оценка:
Kaa>Всем? Ты тоже так считаешь? Ну на тебе кусок кода, разбирайся:
Kaa>
Kaa>SomeString s;
Kaa>...
Kaa>s = (const char*)s;
Kaa>


Kaa>Как успехи?


Ты считаешь, что если бы в std::string был operator(const char*) то я бы без труда понял, что означает твой идентификатор SomeString? Не улавливаю связи...
Re[6]: string
От: SWW Россия  
Дата: 14.07.03 07:26
Оценка:
D>Все бы было не так плохо, если бы в C++ было реализовано наследование конструкторов.

А также деструкторы всегда должны быть виртуальными.

D>Никто не знает предысторию, почему это не было реализовано?
Re[7]: string
От: deviv  
Дата: 14.07.03 07:34
Оценка:
Здравствуйте, SWW, Вы писали:

D>>Все бы было не так плохо, если бы в C++ было реализовано наследование конструкторов.


SWW>А также деструкторы всегда должны быть виртуальными.


Ну если говорить об переопределении поведения класса через наследование, то в STL все плохо:
ни тебе виртуальных деструкторов, ни вообще никаких виртуальных методов. Все методы или public, или private.
И даже если что-нибудь попадется protected, так это часть реализации не регламентированная в стандарте.

Единственное, что можно сделать через наследование — добавить некую функциональность. Но когда видишь десяток конструкторов — все жедание сразу пропадает...
... << RSDN@Home 1.1 beta 1 >>
WBR,
Влад Волосюк
Re[5]: string
От: m.a.g. Мальта http://dottedmag.net/
Дата: 14.07.03 07:35
Оценка: +1
Здравствуйте, SWW, Вы писали:

SWW>Перепишите мне строку из реальной программы используя форматирование потоков:

SWW>
SWW>s.Format("Прибор %s No%.2x%.2x наработка %d ч. %.2f мин.",
SWW>name, hi_numb, lo_numb, (int)time, 60.f*(time-(int)time));
SWW>

SWW>и сравните полученные результаты.

А зачем нам форматирование потоков. Нам ведь строка нужна?

[ccode]
std::cout << boost::format("Прибор %|s| No%|.2x|%|.2x| наработка %|d| ч. %|.2f| мин.")
% name % hi_numb % lo_numb % ((int)time) % (60.f*(time-(int)time));
[ccode]

Зато гораздо более типобезопасно.
... << RSDN@Home 1.1 beta 1 >>
Re[5]: string
От: MaximE Великобритания  
Дата: 14.07.03 07:35
Оценка: +1
Здравствуйте, SWW, Вы писали:


SWW>Перепишите мне строку из реальной программы используя форматирование потоков:

SWW>
SWW>s.Format("Прибор %s No%.2x%.2x наработка %d ч. %.2f мин.",
SWW>name, hi_numb, lo_numb, (int)time, 60.f*(time-(int)time));
SWW>

SWW>и сравните полученные результаты.

Переписываю:
#include <iostream>
#define BOOST_STRICT_CONFIG
#include <boost/format.hpp>

int main()
{
    std::wcout.imbue(std::locale(".866"));
    boost::wformat f(L"Прибор %1% No%2$.2x%3$.2x наработка %4% ч. %5$.2f мин.\n", std::locale(".866"));
    f % L"хреновина" % 1 % 2 % 12 % 34;
    std::wcout << f;

    return 0;
}
Re[6]: string
От: AndrewJD США  
Дата: 14.07.03 08:38
Оценка:
Здравствуйте, MaximE, Вы писали:


ME>Переписываю:

ME>
ME>#include <iostream>
ME>#define BOOST_STRICT_CONFIG
ME>#include <boost/format.hpp>

ME>int main()
ME>{
ME>    std::wcout.imbue(std::locale(".866"));
ME>    boost::wformat f(L"Прибор %1% No%2$.2x%3$.2x наработка %4% ч. %5$.2f мин.\n", std::locale(".866"));
ME>    f % L"хреновина" % 1 % 2 % 12 % 34;
ME>    std::wcout << f;

ME>    return 0;
ME>}
ME>


Круто. А Boost == STL ?
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re: string
От: maq Россия http://www.maqdev.com
Дата: 14.07.03 10:06
Оценка:
Привет всем!

Может кто то написал в топике, но я не нашел.

Есть попытка реализовать строкую близкую по реализации к действительно удобной CString
и при этом перенсоимой: http://home.earthlink.net/~jmoleary/stdstring.htm

В свое время я использовал и вроде работало.

Кстати она наследуется от basic_string хотя этого и нельзя делать
Re: string
От: icWasya  
Дата: 14.07.03 10:36
Оценка:
Здравствуйте, Аноним, Вы писали:


А> Помогите, пожалуйста, начинающему разобраться


А> Что-то я не пойму до конца всю прелесть типа string.

А> Как мне получить доступ к самомоу буферу? Ведь c_str() возвращает константу :\
А> Например, как мне использовать тип string для получения текста окна?

А> string s("");

А> GetWindowText(...???...);

а так не поможет
s.resize(1000,' ');
GetWindowText(S.c_str(),s.length());

??????
Re[2]: string
От: deviv  
Дата: 14.07.03 10:40
Оценка:
Здравствуйте, icWasya, Вы писали:

W>Здравствуйте, Аноним, Вы писали:



А>> string s("");

А>> GetWindowText(...???...);

W>а так не поможет

W> s.resize(1000,' ');
W> GetWindowText(S.c_str(),s.length());

Чтобы это откомпилировалось нужен const_cast.
Ну а чтобы это всегда стабильно работало — извините, не получится....
... << RSDN@Home 1.1 beta 1 >>
WBR,
Влад Волосюк
Re[4]: string
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 14.07.03 11:32
Оценка:
Здравствуйте, deviv, Вы писали:

D>2) Опять же, почему я обязан давать описание описание того же исключения как ACSII строку? Почему я не могу вернуть описание исключения как UNICODE строку?


Потому что есть базовый класс всех исключений — exception, который хочет именно ASCII строку.

Но, если так хочется передавать UNICODE строки средствами стандартных классов исключений — перекодируй из в UTF-8

Реально же, исключения вообще не должны содержавть какой-либо текст. В них нужно хранить:
  1. Код (идентификатор) ошибки, по которому можно найти шаблон сообщения
  2. Параметры для формирования сообщения
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[5]: string
От: deviv  
Дата: 14.07.03 11:48
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Здравствуйте, deviv, Вы писали:


D>>2) Опять же, почему я обязан давать описание описание того же исключения как ACSII строку? Почему я не могу вернуть описание исключения как UNICODE строку?


КД>Потому что есть базовый класс всех исключений — exception, который хочет именно ASCII строку.


А почему он хочет именно ASCII? Причина? Чем ASCII лучше другого представления строк?

КД>Но, если так хочется передавать UNICODE строки средствами стандартных классов исключений — перекодируй из в UTF-8


А хочу гибкости. А раз ее меня лишают, то пытаюсь понять ради чего?

КД>Реально же, исключения вообще не должны содержавть какой-либо текст. В них нужно хранить:

КД>

    КД>
  1. Код (идентификатор) ошибки, по которому можно найти шаблон сообщения
    КД>
  2. Параметры для формирования сообщения
    КД>

Тогда для чего там метод what()? Чтобы по коду найти сообщение об ошибке, подставить в него параметры?
Затем перекодировать в UTF-8 (например), вернуть const char* наружу, что его там же снова перекодировали в UNICODE и записали в лог или отобразили на экран?
... << RSDN@Home 1.1 beta 1 >>
WBR,
Влад Волосюк
Re[3]: string
От: Ash-2 Россия  
Дата: 14.07.03 12:09
Оценка:
Здравствуйте, voxel3d, Вы писали:

V> У тебя со временем что-то не сходится.. То три месяца назад, то через год...

На самом деле эта история началась 3 года назад и продолжается до сих пор (окончатель запутал со временем ?

V> Вывод: со стандартной библиотекой если нормально всё выучить, можно работать вполне нормально, а недоучившись, оно, конечно, через это самое место. Недоучившись, потом и задаются дурацкие вопросы -- а нахрен надо было такие строки писать??

А что кому-то удавалось "нормально ВСЕ выучить"? Потом, я не понял в чем претензия: в вопросе топика? (нормальный вопрос, хотя это и не мое дело) или в моем ответе? (рассказал про себя, поскольку был в свое время также неприятно удивлен этой особенностью стандартного string)

V> А оно и не заточено вовсе под работу с GetWindowText() или ещё подобным чем-то. Оно вообще-то, и не знает о существовании WindowsAPI.

Т.е. если прога под Win32, то лучше о нем забыть...
Re[6]: string
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 14.07.03 12:15
Оценка:
Здравствуйте, deviv, Вы писали:

D>Тогда для чего там метод what()? Чтобы по коду найти сообщение об ошибке, подставить в него параметры?


Вот ты вбил себе в голову, что пользователю нужно отобразить именно то, что возращает what и теперь мечешься — а как мне вывести юзеру что-то другое. Исходя из своео небольшого опыта — стандарные исключения должны использоваться только для перехвата нештатных ситуаций. Ну типа нехватка памяти, выход за пределы диапазона и т.д.

На прикладном уровне нужно генерировать свои классы исключений, производные от exception.

Ты перехватываешь все исключения
catch(exception&)

а потом через dynamic_cast анализируешь, что и именно ты поймал и как его нужно обработать.

здесь
Автор: Коваленко Дмитрий
Дата: 19.02.03


Обрати внимание на реализацию OLEDB_ProcessErrorException. Если она не смогла понять что это за исключение, то только тогда она лезет к exception::what()

понятно, что это не предназначено для написания маленьких программ. Но в больших программах, думается, всё именно так и делается.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[7]: string
От: MaximE Великобритания  
Дата: 14.07.03 14:12
Оценка:
Здравствуйте, AndrewJD, Вы писали:

AJD>Круто. А Boost == STL ?


Boost — это то, чем должен быть STL.
Re[3]: string
От: icWasya  
Дата: 14.07.03 14:25
Оценка:
Здравствуйте, 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());

>> ......чтобы это всегда стабильно ......

и в чём тут проблема? — если только неправильно учитывать размер буфера — так ведь ничего не поможет
Re[4]: string
От: deviv  
Дата: 14.07.03 14:30
Оценка:
Здравствуйте, icWasya, Вы писали:

W> и в чём тут проблема? — если только неправильно учитывать размер буфера — так ведь ничего не поможет


Проблема в том, что c_str() не обязан возвращать непосредственно буфер. Это остается в компетенции разработчика библиотеки.
Точко также, факт того, что c_str() возвращает ZERO-terminated строку не обязывает хранить представление строки именно в этом формате.
... << RSDN@Home 1.1 beta 1 >>
WBR,
Влад Волосюк
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.