Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
ROMISH
Зарегистрирован: 25.10.2002 Сообщения: 3
|
Добавлено: Пт Окт 25 2002 19:14 Заголовок сообщения: Помогите с C++ |
|
|
Пишу класс для работы со строками. Вот функция, которая должна возвращать Pos левых символов.
CString& CString::LeftTrim(int Pos) { char *tmp = new char[Pos]; memcpy(tmp, this->Data, Pos); CString Res = tmp; return Res; }
Здесь в переменной Data лежит строка-источник.
Пример использования: CString str1 = "qwerty"; CString str2; str2 = str1.LeftTrim(2);
Естественно, что такой код не работает, так как деструктор объекта Res вызывается раньше, чем задействуется конструктор копирования Res в Str2. Как обойти такую ситуацию? Помогите пожадуйста!!! |
|
Вернуться к началу |
|
|
SAV
Зарегистрирован: 22.10.2002 Сообщения: 46 Откуда: Нижний Новгород
|
Добавлено: Пт Окт 25 2002 20:28 Заголовок сообщения: Re: Помогите с C++ |
|
|
попробуй return (CString(tmp)); ??? |
|
Вернуться к началу |
|
|
SAV
Зарегистрирован: 22.10.2002 Сообщения: 46 Откуда: Нижний Новгород
|
Добавлено: Пт Окт 25 2002 20:44 Заголовок сообщения: Re: Помогите с C++ |
|
|
А вообще-то наверное так: char* CString::LeftTrim(int Pos) { char *tmp = new char[Pos]; memcpy(tmp, this->Data, Pos); return tmp; } при этом, д.б. перегружен operator=(char*) (приравнивание указателей), и кто-то должен нести ответственность (скорее всего деструктор CString) за уделение tmp. class CString{ /*You members*/ operator =(char* s){ if (Data!=NULL) // if (Data) delete Data; Data=s; }
} |
|
Вернуться к началу |
|
|
JekLove
Зарегистрирован: 22.02.2002 Сообщения: 41 Откуда: Новосибирск
|
Добавлено: Сб Окт 26 2002 09:58 Заголовок сообщения: Re: Помогите с C++ |
|
|
Ой... Во-первых, вот это мне не нравится:
char * tmp = new char[Pos];
Почему не Pos+1? И где завершающий '\0'? Нету...
Во-вторых, где delete[] tmp после создания и использования tmp? Тоже нету...
В-третьих, ну откуда это, что деструктор вызывается до конструктора? Ничего подобного. Цельный объект нормально копируется в стек. Надо только правильно организовать оператор присваивания, и будет счастье.
Ну, это вроде бы все |
|
Вернуться к началу |
|
|
Alexy
Зарегистрирован: 22.10.2003 Сообщения: 48
|
Добавлено: Вт Окт 29 2002 15:00 Заголовок сообщения: Re: Помогите с C++ |
|
|
Конечно если возвращается объект, то конструктор копирования вызывается до деструктора. Но в данном случае конструктор вообще не вызывается, поскольку ф-я возвращает ссылку на объект. ( CString& CString::LeftTrim(int Pos) )
Как правило функции-члены класса возвращающие ссылку на собственный тип, осуществляют операции над данными this. Т.е. временный объект просто не нужен:
CString& CString::LeftTrim(int Pos) { memcpy(this->Data, whatsoever); return *this; } |
|
Вернуться к началу |
|
|
Борис Гость
|
Добавлено: Вт Окт 29 2002 16:58 Заголовок сообщения: Попробую подтолкнуть в нужном/возможном направлении |
|
|
Обрати внимание на такую хитрость: что значит "возвращает значение 1" в C++? Это значит, что в регистре AL/AX/EAX содержится число 1, и оно копируется в так называемое "леводопустимое выражение". А что в твоем случае? В твоем случае должна "возвращаться" строка, то есть несколько символов, которые с большой вероятностью ни в какой регистр не уместятся. Поэтому тебе нужно эмулировать "возвращение".
Так вот, тебе нужно придумать: 1) как не "возвратить", а скопировать в *str2 Pos символов, 2) как и когда выделить/перевыделить память под эти символы, 3) как пункты 1) и 2) исполнить в перегруженном операторе "=" |
|
Вернуться к началу |
|
|
|