Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переменная класса, Как вызвать переменную класса 
:(
    Опции темы
Слава
Дата 9.11.2005, 18:37 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











У меня есть класс Class1;
В нем описана переменная AnsiString perem , также есть функция этого класса function1();

Вопрос :как передать значение переменной perem в функцию function1() чтобы ее начальное значение(переменной) неизменилось при выходе из этой функции.

Я делаю так:
class Class1
{
public:
AnsiString perem;
void __fastcall function1(AnsiString perem);
};

void __fastcall function1(AnsiString perem);
{
AnsiString dubleperem = perem;
strcat (dubleperem .c_str(), "\\");
....................//дальше эта переменная добавляется в stringlist
}

тут происходит вызов функции которая передает значение переменной perem;
item- обьект классса Class1;
item->function1(item->perem);
  Вверх
_hunter
Дата 9.11.2005, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



передавать копию: AnsiString(perem)


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Слава
Дата 9.11.2005, 23:39 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Сделал вот так:

class Class1
{
public:
AnsiString perem;
void __fastcall function1(AnsiString const &perem);
};

void __fastcall function1(AnsiString const &perem);
{
AnsiString dubleperem = perem;
strcat (dubleperem .c_str(), "\\");
....................//дальше эта переменная добавляется в stringlist
}

По архангельскому говорится что переменная и копироваться не будет и изменить ее будет невозможно.
Но у меня при входе в функцию function1 ,переменная класса perem изменяется вместе
с переменной dubleperem(которой я присваиваю значение perem )
  Вверх
_hunter
Дата 10.11.2005, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



интересная запись: AnsiString const &perem. только смысл она имеет только для указателей...
для ссылок так: const AnsiString& perem писать нужно...
только всеравно не факт что поможет -- AnsiString -- объект со своим механизмом подсчета ссылок...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Слава
Дата 10.11.2005, 16:44 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











class Class1
{
public:
AnsiString perem;
void __fastcall function1(AnsiString &perem);
};

void __fastcall function1(AnsiString &perem);
{
char* Param=new char [perem.Length()];

StrCopy(ParamUsb,perem.c_str());
char* buf="";
char* tmp="\\";
buf=strcat(Param,tmp);
delete (ParamUsb);//Выскакивает Access Violetion
}

вызов ф-и
item->function1(item->perem);
  Вверх
Neitron
Дата 10.11.2005, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 3.10.2005
Где: Москва

Репутация: нет
Всего: 5



Во первых, если все члены класса являются открытыми, то предпочтительней использовать структуру.
Во вторых что за переменная такая ParamUsb??
Далее perem.c_str(), создает итак копию, использовать можно так

Код

const char * buf = perem.c_str();


Что за ParamUSB?

Это сообщение отредактировал(а) Neitron - 10.11.2005, 16:56


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
Слава
Дата 10.11.2005, 17:17 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











прошу прощения никакого ParamUsb.
void __fastcall function1(AnsiString &perem);
Код

{
char* Param=new char [perem.Length()];

StrCopy(Param,perem.c_str());
char* buf="";
char* tmp="\\";
buf=strcat(Param,tmp);
delete (Param);//Выскакивает Access Violetion
}

  Вверх
Neitron
Дата 10.11.2005, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 3.10.2005
Где: Москва

Репутация: нет
Всего: 5



Красивый код. Cразу не заметил. Кто Автор книги который показал его тебе?smile
Попробуй так чтоли) smile
Код
{
char* Param=new char [perem.Length()];
StrCopy(Param,perem.c_str());
char* buf=""; // зачем это?:
char* tmp="\\";
buf=strcat(Param,tmp);
delete[] Param;
}


Это сообщение отредактировал(а) Neitron - 10.11.2005, 17:59


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
Слава
Дата 11.11.2005, 09:42 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











На счет этой строки
Код

delete[] Param;

я сразу заменил нестыковку, но у меня и так и так вчера некомпилилось.
Зато сегодня компилятору это понравилось))
Спасибо всем за внимание и помощь.
и компилятору спасибо)) за хорошее настроение))



  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.3745 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.