Методы работы с текстом.
CString sWord = "word";
и обращаюсь к буквам как
dc.TextOut(x, y, sWord[0]);
а в VC7 так не получается, как можно работать с отдельными буквами слова.
т.е. я не хочу разбивать слово на отдельные компоненты типа ... = {"w", "o", "r", "d"};
вот например такой код (точнее просто смысл кода):
CString letter = "w";
for(int i = 0; i<4; i++)
{
if(sWord == letter)
MessagwBox("The letter is enable", "Congratulations!!!", MB_OK);
break;
}
расскажите подробнее пожалуйста, у меня часто такие вопросы возникают, тольком поговорить нескем.
Ты пытаешся сравнять строку с буквой, а это нехорошо.. Надо либо sWord == letter либо sWord == letter[0] либо sWord == 'w' (не " а ')
Да вот знаешь... я ничего не пытаюсь сравнять, я просто попытался объяснить в чем вопрос, а на VC6 прчемуто работает, я и сам удивлен!)
Вот лучше скажи как сравнить букву скажем "номер 1" в слове с заданной.
Народ, подскажите, как можно работать с текстом, вот скажем VC6 там у меня получается
CString sWord = "word";
и обращаюсь к буквам как
dc.TextOut(x, y, sWord[0]);
а в VC7 так не получается, как можно работать с отдельными буквами слова.
т.е. я не хочу разбивать слово на отдельные компоненты типа ... = {"w", "o", "r", "d"};
вот например такой код (точнее просто смысл кода):
CString letter = "w";
for(int i = 0; i<4; i++)
{
if(sWord == letter)
MessagwBox("The letter is enable", "Congratulations!!!", MB_OK);
break;
}
расскажите подробнее пожалуйста, у меня часто такие вопросы возникают, тольком поговорить нескем.
В классе CString для доступа к отдельным элементам строки есть функция GetAt(int index), где index порядковый номер элемента (начиная с 0).
Тогда твой пример примет следующий вид:
int nStrLen = sWord.GetLength();
for(int i = 0; i < nStrLen; i++)
{
if(sWord.GetAt(i) == 'w')
MessagwBox("The letter is enable", "Congratulations!!!", MB_OK);
break;
}
А вот интересно на VisualC++6 почему это работает?
CString sWord = "word";
dc.TextOut(x, y, sWord[0]);
???
Во, спасибо, думаю то, что надо, только на работоспособность еще проверить неуспел.
А вот интересно на VisualC++6 почему это работает?
CString sWord = "word";
dc.TextOut(x, y, sWord[0]);
???
В CString есть оператор [], кот- эквивлентен GetAt()
sWord[0] возвращает 'w'
В CString есть оператор [], кот- эквивлентен GetAt()
sWord[0] возвращает 'w'
Я конечно понимаю все эти эквиваленты, но почему тогда в 7-й версии VC у меня это не выходит?
В CString есть оператор [], кот- эквивлентен GetAt()
sWord[0] возвращает 'w'
Такая ошибка
d:\Мои документы\Visual Studio Projects\Proba\ProbaDlg.cpp(93): error C2664: 'CWnd::SetDlgItemTextA' : cannot convert parameter 2 from 'ATL::CSimpleStringT<BaseType>::XCHAR' to 'LPCTSTR'
with
[
BaseType=TCHAR
]
Вот в такой процедуре
void CProbaDlg::OnBnClickedButton1()
{
m_edit = "Hello";
SetDlgItemText(IDC_EDIT1, m_edit[1]);
}
SetDlgItemText(IDC_EDIT1, (LPCTSTR)m_edit[1]);
Должно работать...
Сделай приведение типов:
SetDlgItemText(IDC_EDIT1, (LPCTSTR)m_edit[1]);
Должно работать...
В VC я бы такого никогда не делал.
1. Для IDC_EDIT1 создавай Control переменную (в VC 7 по другому нельзя) - далее через SetWindowText().
2. Но если как у тебя тогда имей ввиду, что в VC 7 (LPCTSTR) не работает - используй CString.
В VC я бы такого никогда не делал.
1. Для IDC_EDIT1 создавай Control переменную (в VC 7 по другому нельзя) - далее через SetWindowText().
2. Но если как у тебя тогда имей ввиду, что в VC 7 (LPCTSTR) не работает - используй CString.
Да я понимаю что SetWindowText..., я пытаюсь обратиться к элементам строки, как мне взять в VC7 букву в слове, так как я беру ее в VC6.
int CGraphicsDlg::OutLetter(CClientDC* odc, CString sStr)
{
odc->SetTextColor(RGB(0, 255, 255));
odc->SetBkMode(TRANSPARENT);
int x = 12;
int y = 14;
for (int i=0; i<sStr.GetLength(); i++)
{
if(m_letter == sStr.GetAt(i))
odc->TextOut(x, y, sStr.GetAt(i));
x+=16;
}
return 0;
}
Да я понимаю что SetWindowText..., я пытаюсь обратиться к элементам строки, как мне взять в VC7 букву в слове, так как я беру ее в VC6.
int CGraphicsDlg::OutLetter(CClientDC* odc, CString sStr)
{
odc->SetTextColor(RGB(0, 255, 255));
odc->SetBkMode(TRANSPARENT);
int x = 12;
int y = 14;
for (int i=0; i<sStr.GetLength(); i++)
{
if(m_letter == sStr.GetAt(i))
odc->TextOut(x, y, sStr.GetAt(i));
x+=16;
}
return 0;
}
VC 7 строже относится к написанию кода. Кроме как GetAt к элементам строик обратиться вряд ли получится.
odc->TextOut(x, y, CString(sStr.GetAt(i)));
VC 7 строже относится к написанию кода. Кроме как GetAt к элементам строик обратиться вряд ли получится.
odc->TextOut(x, y, CString(sStr.GetAt(i)));
а такого плана,... или вообще какие еще методы работы есть?
... скажем char *cWord[5] = "abcd";
а если несколько слов???
то искать определенные символы? скажем пробелы?
типа : CString sStr = "строка из слов";
тут искать пробелы?
а такого плана,... или вообще какие еще методы работы есть?
... скажем char *cWord[5] = "abcd";
а если несколько слов???
то искать определенные символы? скажем пробелы?
типа : CString sStr = "строка из слов";
тут искать пробелы?
char *cWord[5] = "abcd"; - работать не будет, пиши так - char cWord[] = {'a','b','c','d'};
А для работы со словами используй массив CString, найти символ Find, открой MSDN там весь класс CString описан.
char *cWord[5] = "abcd"; - работать не будет, пиши так - char cWord[] = {'a','b','c','d'};
А зачем так сложно?
Нельзя ли попроще, так
char cWord[5] = "abcd";
или вот так
char cWord[] = "abcd";
А для работы со словами используй массив CString, найти символ Find, открой MSDN там весь класс CString описан.
Я не вижу преимуществ у CString перед std::string, вот преимущества std::string очевидны. Поэтому рекомендую использовать std::string.
Совсем не очевидны
Совсем не очевидны
Основное и главное преимущество std::string в том, что это стандартный класс. Остальные преимущества (как то переносимость и т.п.) являются следствием.
Основное и главное преимущество std::string в том, что это стандартный класс. Остальные преимущества (как то переносимость и т.п.) являются следствием.
СString более гармонично вписывается в среду программирования и имеет весьма полезные функции, что ИМХО значительно важнее.
Кстати, каждый компилятор имеет свой список отклонений от стандарта, и boost в VC++8 не поддерживает Safe библ.
В общем виде вопросы о переносимости программ( за исключением довольно простых приложений с интерфейсом на уровне cin/cout ) ИМХО беспредметны.
СString более гармонично вписывается в среду программирования
Что это значит? :)
и имеет весьма полезные функции
Например?
Полезные для кого?
Кстати, каждый компилятор имеет свой список отклонений от стандарта, и boost в VC++8 не поддерживает Safe библ.
Фраза совсем не понятна.
При чем тут компиляторы и несоответствие стандарту?
При чем тут boost и стандарт? Когда это boost стал частью стандарта?
При чем тут boost и VC++8? Когда это boost стал частью поставки VC++ ?
Что значит "Safe библ."? thread-safe? При чем тут boost?
Что значит "boost не поддерживает библ."? Он сам по себе является "библ.", причем не thread-safe.
И главное, какое это имеет отношение к std::string?
И ещё, CString является thread-safe классом? :)
В общем виде вопросы о переносимости программ( за исключением довольно простых приложений с интерфейсом на уровне cin/cout ) ИМХО беспредметны.
Во-первых, в правильно спроектированных программах UI отвязан от бизнес-логики, а cin/cout - это как раз уже UI.
Во-вторых, под переносимостью нужно понимать не только кроссплатформенную переносимость, но и переход на др. компилятор или др. сопутствующие библиотеки, например оконные. Так если понадобиться перейти с MFC на WTL, Qt или сотню др. библиотек, опять же при реализации UI и сохранением бизнесс-логики без изменения, могут появится большие проблемы. Так же если придется перейти с VC++, на BC++, mingw, CodeWarrior, опять же возникнут те же проблемы.
В-третьих, то, что Std::string явл. частью стандарта позволяет использовать его в остальных стуктурах и механизмах стандарта без каких-либо доработок (например, те же потоки).
Кстати, какой CString имеется в виду? MFC или WTL?
Уже неопределенность... :)
P.S. Чувствую ещё одна длинная дискуссия намечается. В любом случае я высказываю выводы из своего опыта.
да тут и вовсе дискуссия развивается...
....Просто дикий ужас, какие дебри... Я просто пишу програмку, точнее уже написал (студент просил), мне интересно для себя выяснить как можно работать с текстом, я в такие дебри пока и нелезу, т.е. переносимость программ на другие платформы и т.д. Мне совершенно глубоко параллельно использовать какой класс: CString или std::string. Мне пока как неопытному программисту важно само решение условия а не переносимость...
да тут и вовсе дискуссия развивается...
Тогда для начала разберись в чем отличие между символом 'w' и строкой "www", между типом char и char*. Определи какой тип возвращает оператор [] в данном случае.
Видимо, у тебя проблема в этом, но это элементарные основы, которые никто разжевывать не будет (я надеюсь).
Тема форума см выше. Все высказанное относится к CString соответственно теме, если не понятно о чем речь.
CString как известно в MFC, кот. написана (если не придираться к мелочам ) в едином стиле. А std::string сюда не вписывается никак. Ee функции полезны ИМХО для работы. Напр. Format(...). Все в одном классе - очень удобно.
А чтоб в std сформатировать? Использовать fprint? Свое ваять? Еще какую-нибудь библ. использовать? А при этом преобразования типов?
И это очевидные преимущества?
По поводу стандарта.
Стандарт сам по себе ИМХО смысла не имееет и создается ради совместимости(переносимости). В С++ переносимость увы не сбылась, что я и пытался донести на примере boost, ибо недавно ты рекомендовал именно ее. Посмотри на их сайт - там проблемы с VC8 изложены.
Главный же вопрос ИМХО состоит в следующем:
- или ты используешь постоянно развивающейся инструментарий разработки, кот все дальше отклоняется от стандарта.
- или следуешь стандарту ради соблюдения стандарта с заморочками типа выше приведенных
Я предпочитаю первое( не сразу конечно, а после 1 servicepack'а). STL я использую весьма охотно, и std::string в частности, но совсем не потому что это стандарт, а т.к. считаю ее более подходящей в какой-либо конкретной ситуации.
По поводу переносимости в последний раз:
-Я считаю, что С++ не предназначен для написания переносимых предложений. Желающие могут поупражняться вставлять бесчисленные #if - #else - #endif необозримой вложенности и попытаться отладить это на 2-3 платформах. Я на эту тему в дискуссию не вступаю
2 Green
Тема форума см выше. Все высказанное относится к CString соответственно теме, если не понятно о чем речь.
Ну вообще-то тема имеет более общеее звучание: "Методы работы с текстом". И как выяснилось в ходе обсуждения, у автора проблема не с CString, а скорее с пониманием типов C-string и char.
Это не страшно, все когда-то начинали, но пробел надо устранить самостоятельно.
CString как известно в MFC,
Как известно, в WTL тоже есть свой CString.
И я не удивлюсь, что и в др. библиотеках есть одноименный класс.
Напр. Format(...). Все в одном классе - очень удобно.
Например, Format(...) - жуткое наследие C, без типовой безопасности, run-time парсингом и огромным потенциалом для ошибок. А преобразований типов в ней только одно void* -> type, где type получается парсингом строки в рантайме, и никак не застраховано от ошибок приведения типов.
А чтоб в std сформатировать? Использовать fprint? Свое ваять? Еще какую-нибудь библ. использовать? А при этом преобразования типов?
Ну вот, оказывается, всё от пробелов в опыте и знании...
Для формирования строк очень удобно использовать потоки. Там тебе и типовая безопасность и безопасное "преобразование типов". И всё делается в процессе компиляции.
По поводу стандарта.
Стандарт сам по себе ИМХО смысла не имееет и создается ради совместимости(переносимости).
Интересно, а ГОСТ на кефире тоже для совместимости? И переносимости? :D
В С++ переносимость увы не сбылась,
Ещё один пророк-любитель?
Главный же вопрос ИМХО состоит в следующем:
- или ты используешь постоянно развивающейся инструментарий разработки, кот все дальше отклоняется от стандарта.
Это CString и MFC "постоянно развивающейся инструментарий разработки, кот все дальше отклоняется от стандарта"? :D
А при чем тут стандарт?
А при чем тут развивающийся, да ещё и "постоянно"?
По поводу переносимости в последний раз:
Отлично, что в последний раз, т.к. опыта у тебя пока в этом вопросе явно маловато (пока).
Без обид.
-Я считаю, что С++ не предназначен для написания переносимых предложений. Желающие могут поупражняться вставлять бесчисленные #if - #else - #endif необозримой вложенности и попытаться отладить это на 2-3 платформах. Я на эту тему в дискуссию не вступаю
Отлично, что не вступаешь в дискуссию, т.к. мы на этом самом "непереносимом" С++ пишем под следующие платформы:
IBM PC, Sony PS2, Sony PSP, MS XBox, Nintendo GameQube; в перспективе: Sony PS3, MS XBox 360.
Как видишь это не просто разные ОС, а совершенно разные платформы. Так что не думаю, что в ходе дискуссии ты бы смог меня убедить, что мы не можем отлаживаться "на 2-3 платформах".
А без #if можно и нужно обходится, слава богу это не сложно.
Был задан простой и конкретный вопрос: что использовать для форматирования? И получили в ответ? Format() плох, нечто невразумительное про потоки на этапе компиляции и т.п.
О преобразовании типов я упомянул лишь потому, что CString его не требует( Если все CString ). А ты про меня.
А что с boost?
Вот мы и подошли к методу ведения дискуссии.
Уважаемый Green
Вместо ответа на вопрос ты:
- уводишь тему в сторону
- вырываешь из контекста фразу или отдельные слова, полностью искажая смысл сказанного и комментируешь этот тобой искаженный смысл
- стыдливо замалчиваешь неудобные вопросы
- когда подобные аргументы кончаются, ты переходишь на обсуждение качеств опонента
Дискутировать в таком некоструктивном духе не интересно и неприятно. А опускаться на твой уровень и высказаться по поводу твоих качеств - не мой стиль.
Ну и по поводу пререносимости в самый самый последний раз - наверное на уровне Nintendo можно написать что-то, что будет компилироваться и на Sony. Не наверное, а скорее всего можно.
По поводу кефира советую еще раз прочесть название темы.
Нечего на название темы пинять, если ты сам предложил сравнить преимущества CString и std::string и их очевидность. Или я тебя неправильно понял?
Был задан простой и конкретный вопрос: что использовать для форматирования? И получили в ответ? Format() плох, нечто невразумительное про потоки на этапе компиляции и т.п.
1. Был дан вразумительный ответ: для работы со строками лучше использовать std::string. Тебя это возмутило, вот с тобой и веду беседу уже в отрыве от остального контекста.
2. Слово Format вообще не упоминалось до последних постов. Что же касается самого этого метода, я высказал своё отношение - плохая практика использовать void* в С++.
3. Если про потоки и про этап компиляции тебе было что-то не понятно, переспроси, я объясню.
О преобразовании типов я упомянул лишь потому, что CString его не требует( Если все CString ). А ты про меня.
Какое преобразование? Чего не требует?
Раскрой свою мысль.
И что про тебя?
А что с boost?
А что с boost? Ну не поддерживает он НЕСТАНДАРТНУЮ "Safe" C++ Library" ну и что? Ну и нафига она ему сдалась? И при чем тут стандарт?
Чего здесь раздувать из мухи слона? Ты можешь объяснить, что тебя здесь пугает?
Вот мы и подошли к методу ведения дискуссии.
Уважаемый Green
Вместо ответа на вопрос ты:
- уводишь тему в сторону
- вырываешь из контекста фразу или отдельные слова, полностью искажая смысл сказанного и комментируешь этот тобой искаженный смысл
- стыдливо замалчиваешь неудобные вопросы
- когда подобные аргументы кончаются, ты переходишь на обсуждение качеств опонента
Давай начнем с последнего, качества опонента я никогда не обсуждаю, это с успехом делаете вы (конкретно ты и ещё некоторые лица).
Что же касается моих замечаний о недостатке опыта в некоторых вопросах, где ты весьма категоричен, то это не обсуждение твоих качеств, а просто замечание, что не стоит делать поспешных и категоричных выводов.
Есть ещё места, где я притеснил твое самолюбие? Где я обсуждал твои качества или качества других (конкретные места, плз)?
Пока, как я вижу мы обсуждаем меня (в который раз).
На счет увода в сторону, неудобных вопросов и т.п. Я веду беседу, как умею. Для меня нет неудобных вопросов. Ответы, которые очевидны, я выбрасываю, зачем разводить воду. Если тебе хочется все же получить ответ на вопрос, который я "замалчиваю", задай его прямо и внятно. Некоторый вопросы вообще осмыслению не поддаются.
На счет искаженного смысла... Ну как смысл передал, так я его и воспринял. Может здесь не на меня пенять, а на стиль всоего изложения? Я кстати, каждый раз задаю множество вопросов после твоего изложения и пока ни разу не увидел на них вменяемого ответа. "Стыдливо замалчиваешь неудобные вопросы"?
Дискутировать в таком некоструктивном духе не интересно и неприятно. А опускаться на твой уровень и высказаться по поводу твоих качеств - не мой стиль.
Да ну? Ты же этому посвятил целую главу своего поста и не только в этого.
Ну и по поводу пререносимости в самый самый последний раз - наверное на уровне Nintendo можно написать что-то, что будет компилироваться и на Sony. Не наверное, а скорее всего можно.
В каком контексте ты это говоришь?
Если в контексте "платформы на столько схожи", то ты глубоко ошибаешься. Здесь уж тебе придется поверить моему опыту.
Если же в контексте "язык С++ предоставляет возможность написания переносимого кода", то здесь я с тобой полностью согласен. :)
P.S. Надеюсь, достаточно обсуждать меня (хотя бы в этой теме). Что там у нас осталось не закрытое? Потоки и этап компиляции... Пиши, что не понятно, объясню.
Так что же ты все-таки применяешь для форматирования?
Ответ хотелось бы в виде:
- библиотека "ИМЯ БИБЛИОТЕКИ"
- класс "ИМЯ КЛАССА"
- функция "ИМЯ ФУНКЦИИ"
Для каждой задачи нужна своя реализация. В данном случае надо написать простую задачку работы со строками, для этого наилучшим способом подходит CString из MFC. В нем предусмотрены все операции со строками и нет смысла использовать std::string
Что сложного в std::string? Не понимаю...
Что значит нет смысла использовать... тогда и CString нет смысла использовать.
Ну да ладно, проехали.
2 Green
Так что же ты все-таки применяешь для форматирования?
Ответ хотелось бы в виде:
- библиотека "ИМЯ БИБЛИОТЕКИ"
- класс "ИМЯ КЛАССА"
- функция "ИМЯ ФУНКЦИИ"
- библиотека: STL, в некоторых случаях boost
- классы (по сложности задачи): string, stringstream, format (boost, но это уже экзотика)
- функции: методы вышеобозначенных классов, некоторые механизмы из boost (к примеру lexical_cast).
P.S. Что там на счет неотвеченных вопросов?
CString sMyString;
sMyString.Format("I am %d years old", 100 );
Green,
Напиши, пожалуйста, свой вариант этого примера со свеми необходимыми заголовочными файлами
CString sMyString;
sMyString.Format("I am %d years old", 100 );
Green,
Напиши, пожалуйста, свой вариант этого примера со свеми необходимыми заголовочными файлами
std::ostringstream os;
os << "I am " << 100 << " years old";
std::string str = os.str(); // если есть необходимость
Green подскажи пожалуйста где можно найти информацию по std::string. MSDN у меня январь 2002 года, ну раз std:: то думаю это что-то "стандартное", и появилось раньше 2002 года так что должно быть, только мне не попадается.
Я не вижу преимуществ у CString перед std::string, вот преимущества std::string очевидны.
ИМХО это высказывание некорректно и может ввести в заблуждение.
Green, три объекта в твоем примере + 2 преобразования совсем не являются очевидными преимуществами std::string.
Удобство форматирования с пом. потоков весьма условное.
СString совсем не так уж плох и не надо людей пугать "огромным потенциалом для ошибок"
Что сложного в std::string? Не понимаю...
Что значит нет смысла использовать... тогда и CString нет смысла использовать.
AndreySar высказал свое мнение, а ты его сразу анафеме.
Хоть и не ко мне MSDN найдешь здесь англ а здесь русск
Visualex,
ИМХО это высказывание некорректно и может ввести в заблуждение.
Green, три объекта в твоем примере + 2 преобразования совсем не являются очевидными преимуществами std::string.
Удобство форматирования с пом. потоков весьма условное.
СString совсем не так уж плох и не надо людей пугать "огромным потенциалом для ошибок"
AndreySar высказал свое мнение, а ты его сразу анафеме.
Хоть и не ко мне MSDN найдешь здесь англ а здесь русск
MSDN у меня дома на пк есть, в инете дорого было, так покупал когдато диски.
Green, три объекта в твоем примере + 2 преобразования совсем не являются очевидными преимуществами std::string.
Удобство форматирования с пом. потоков весьма условное.
СString совсем не так уж плох и не надо людей пугать "огромным потенциалом для ошибок"
Не знаю, где ты там нашел три объекта, и о каких именно преобразованиях ты говоришь...
Но преимущества очевидны, я повторюсь:
- нет парсинга в рантайме,
- нет использовани void*,
- четкий контроль типов компилятором, а не только программистом.
Этого нет в коде формата printf.
Я пытаюсь довести, что внутри printf-подобного кода преобразований не меньше, но они там в рантайме, т.е. выполняются на каждом вызове функции (!). Ты представляешь, какой там внутри кипящий котел?
Представь огромное предложение в середине которого %i. Машина каждый раз будет перелопачивать этот код, чтоб найти этот заветный %i и вставить туда результат преобразования.
Далее этот пресловутый void*, по большому счету контроль сваливается на плечи программиста, который должен следить за правильным количеством аргументов и соотв. их типов, указывая тип дважда (один раз применением переменной, а второй раз раскрывая что за тип этой переменной в строке для парсинга).
Кроме того типы должны быть POD-ам, т.е. стандартными int, float, char* и т.п. Ничего нового ввести нельзя.
Ну и потом эта запись "i=%i d=%d c=%c s=%s" не так явна, как "i=" << i << "d=" << d << "c=" << c << "s=" << s
Из всего перечисленного мне больше всего не нравится void*, т.к. я его в С++ совсем не терплю. :)
Green подскажи пожалуйста где можно найти информацию по std::string. MSDN у меня январь 2002 года, ну раз std:: то думаю это что-то "стандартное", и появилось раньше 2002 года так что должно быть, только мне не попадается.
Да, std::string - это стандартная вещь и описана она в стандарте С++. Я всем советую (и сам придерживаюсь этого совета), что стандарт учить надо, хотя бы в первом приближении. Поэтому вот ссылка на стандарт (2003):
http://anatolix.naumen.ru/files/books/CPPStandard2003.zip
Но сразу предупреждаю, что это сложно.
А на счет MSDN 2002, описание std::string в нем конечно же есть, но искать его надо как basic_string, т.к. сам std::string - это инстанированный типос char класс basic_string.
Еще глянь в MSDN "string class STL samples".
где можно найти информацию по std::string. MSDN у меня ...
Мне, помнится, с помощью MSDN с STL разобраться не удалось, возможно стоит поискать
"C++ Standard Library, The: A Tutorial and Reference" by Nicolai M. Josuttis (была, помнится, на сайте anatolix'а), так же "Effective STL" Скотта Мейерса.
Мне, помнится, с помощью MSDN с STL разобраться не удалось, возможно стоит поискать
"C++ Standard Library, The: A Tutorial and Reference" by Nicolai M. Josuttis (была, помнится, на сайте anatolix'а), так же "Effective STL" Скотта Мейерса.
автору темы. вот немного про STL. попытайся также найти книгу Амерааля "STL для программистов на С++"
http://pegasus.rutgers.edu/~elflord/cpp/stdlib/
к дискусии. мне, как человеку, который далек от программирования, непонятно, зачем использовать гибрид С & С++ в виде
CString sMyString;
sMyString.Format("I am %d years old", 100 );
если вы пишете на С++? я всегда думал что это два разных языка. а преобразования подобные printf - по моему не С++ way ;)
впрочем, может я чего то не понимаю?
CString является для меня абсолютно бесполезной и ненужной вещью, так как привязывает к MFC или WTL или ... Я практически никогда не использую этих библиотек. Win32 Application и вперед. То-есть стандартные возможности С++ рулят. Для работы с потоками мне ничего не нужно, а для CString...
То-есть очко в пользу Green'a
Не в обиду dinasok51. ;)
Не знаю, где ты там нашел три объекта, и о каких именно преобразованиях ты говоришь...
Но преимущества очевидны, я повторюсь:
- нет парсинга в рантайме,
- нет использовани void*,
- четкий контроль типов компилятором, а не только программистом.
Этого нет в коде формата printf.
Я пытаюсь довести, что внутри printf-подобного кода преобразований не меньше, но они там в рантайме, т.е. выполняются на каждом вызове функции (!). Ты представляешь, какой там внутри кипящий котел?
Представь огромное предложение в середине которого %i. Машина каждый раз будет перелопачивать этот код, чтоб найти этот заветный %i и вставить туда результат преобразования.
Далее этот пресловутый void*, по большому счету контроль сваливается на плечи программиста, который должен следить за правильным количеством аргументов и соотв. их типов, указывая тип дважда (один раз применением переменной, а второй раз раскрывая что за тип этой переменной в строке для парсинга).
Кроме того типы должны быть POD-ам, т.е. стандартными int, float, char* и т.п. Ничего нового ввести нельзя.
Ну и потом эта запись "i=%i d=%d c=%c s=%s" не так явна, как "i=" << i << "d=" << d << "c=" << c << "s=" << s
Из всего перечисленного мне больше всего не нравится void*, т.к. я его в С++ совсем не терплю. :)
Виноват, обсчитался - 2 объекта.
Вот определение из MSDN
void Format( LPCTSTR lpszFormat, ... );
void Format( UINT nFormatID, ... );
Алгоритмы парсинга уже давно отлажены и никаких проблем не представляют.
Преобразования в текстовый формат везде выролняются runtime. ( не будешь же ты утверждать что "i=" << i производится в процессе компиляции)
При введении новых типов нужно определять оператор "<<". Возможности форматирования СString также могут быть расширены.
Обе приведенные тобой строки ИМХО одинаково нечитабельны
Действительно ИМХО существенное отличие - это необходимость задавать тип форматирования в отрыве от формата данных. Однако вызванные этим ошибки легко локализуются, т.к. тут же видишь их последствия.
Но для безусловность преимуществ этого ИМХО недостаточно.