Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Кто знает удобный класс для строк?


Автор: Diaus 24.7.2004, 09:17
Пользовался долгое время классом CString, но в некоторых моментах он меня не устраивает:
1) Он работает, как тип по значению, тобишь при присваивании происходит полное копирование
CString s1 ="Some string";
CStrng s2;
s2 = s1;
2) Попробовал как-то поюзать его в консольном приложении, так что-то не получилось. Кстатии не подскажете, какие хедеры нужно включить для этого(или для этого обязательно юзать библиотеку MFC)

Автор: chipset 24.7.2004, 09:20
Насчёт первого, не понял конкретно что тебе не нравится?
Насчёт второго, юзай STL.
Код

#include <iostream/*.h если Visual C++ 6.0*/>
using namespace std;
void main () {
string str;
str="something";
}

Автор: Diaus 24.7.2004, 15:25
По-моему я довольно ясно сказал, повторюсь подробнее.
Что конкретно не нравится: при каждом присваивании создается дополнительная копия, а я хочу, чтобы копия создавалась только при изменении.
MyString str1 = "abcd";
MyString str2 = str1;// str1 и str2 указывают на одну и ту же строку
str2[2] = 'k'; // для str2 создаётся отдельная копия!
В обычном случае копия создаётся сразу
Вопрос был в том, имеются ли стандартные классы строк, которые реализовывали бы такое поведение?

Во второй части вопроса я спрашивал про CString(хотя и за string спасибо, но меня интересовал именно CString).

Автор: Fixin 24.7.2004, 20:43
Попробуй сделать свой собственный класс с перегрузкой операторов. Все будет так, как ты захочешь.

Автор: Diaus 24.7.2004, 23:38
Этим сейчас и занимаюсь smile.gif

Автор: Borisff2003 26.7.2004, 05:41
А кто будет отвечать за удаление строки, или ссылки считать будешь?

Автор: chipset 26.7.2004, 07:17
Diaus
Для CString надо включить #include <atlstr.h>
Добавлено @ 07:17
Он вообще ATL'овский класс насколько я понял...

Автор: AndyY 26.7.2004, 10:27
Diaus
сдается мне, что такой класс породит исключительно опасный код. Вот пример:

Код

void myfunc( superstring &s )
{
 s = "myfuc called";
}

superstring s1 = "test";
superstring s2 = s1;

//тут ссылаются на один кусок памяти

myfunc( s2 );

//а тут уже - на разные.


глядя на код, это поведение неочевидно, а значит породит баги.

Автор: Borisff2003 26.7.2004, 10:54
Код

void myfunc( string &s )
{
s = "myfuc called";
}

string s1 = "test";
string s2 = s1;

//тут строки одинаковые

myfunc( s2 );

//а тут уже разные.

Тут проблема не в классе а в функции
А вот то что придется реализовывать семантику умного указателя с автоматическим подсчетом ссылок, вот это да.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)