Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Помогите с C++

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
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?
Тоже нету...

В-третьих, ну откуда это, что деструктор вызывается до конструктора? Ничего подобного. Цельный объект нормально копируется в стек. Надо только правильно организовать оператор присваивания, и будет счастье.

Ну, это вроде бы все Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
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) исполнить в перегруженном операторе "="
Вернуться к началу
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...